Не работает Binding для наследующего класса. WPF

241
15 мая 2018, 08:20

Пол дня выяснял, почему не биндятся элементы в ListView, но как решить ситуацию - не пойму. С WPF работаю совсем немного.

<ListView x:Name="lvChildItems" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding Comparator.files}" Grid.Row="0" Grid.RowSpan="2" Grid.Column="1">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Name" Width="300" DisplayMemberBinding="{Binding Name}"/>
        </GridView>
    </ListView.View>
</ListView>

Этот код не работает. Когда для интереса заменил Comparator.files на Comparator.Snapshots, все заработало.

Snapshots - List<Snapshot>, files - List<FileP>. Свойство Name у Snapshot определено в самом классе, класс FileP наследует его от базового абстрактного FileOrFolder и по-этому (скорее всего, ибо других ) Binding не отрабатывает. Как решить данную проблему?

UPD
Конструктор формы:

public Result()
{
    InitializeComponent();
    lvChildItems.ItemsSource = Comparator.files;
    ...
}

Класс Comparator

static class Comparator
{
    public static List<Snapshot> Snapshots = new List<Snapshot>();
    public static List<FileP> files = new List<FileP>();
    ...
}

Класс FileOrFolder

public abstract class FileOrFolder
{
    public string Name { get; set; }
    ...
}

Класс Folder

public class Folder : FileOrFolder
{
    public List<FileOrFolder> ChildItems { get; set; }
    public List<FileP> Files
    {
        get { return GetFiles(); }
    }
    public List<FileP> GetFiles()
    {
        var files = new List<FileP>();
        foreach (var item in ChildItems)
            if (item.GetType() == typeof(FileP))
                files.Add((FileP)item);
        return files;
    }
    ...
}

Код, устанавливающий значение Comparator.files

private void tvFiles_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    if (tvFiles.SelectedItem != null)
    {
        Comparator.files = ((Folder)((TreeViewItem)tvFiles.SelectedItem).DataContext).Files;
        lvChildItems.Items.Refresh();
    }
}

Код для постройки дерева

public static TreeViewItem BuildFSTree(Folder folder)
        {
            TreeViewItem root = new TreeViewItem();
            root.DataContext = folder;
            root.Header = folder.Name;
            root.FontFamily = new FontFamily("Microsoft Sans Serif");
            root.FontWeight = FontWeights.Normal;
            foreach (var item in folder.ChildItems)
                if (item.GetType() == typeof(FileP))
                {
                    root.FontWeight = FontWeights.Bold;
                    break;
                }
            if (folder.status != null)
            {
                if ((bool)folder.status)
                    root.Foreground = Brushes.Green;
                else
                    root.Foreground = Brushes.Red;
            }
            foreach (FileOrFolder fof in folder.ChildItems)
            {
                if (fof.GetType() == typeof(Folder))
                    root.Items.Add(BuildFSTree((Folder)fof));
            }
            return root;
        }

Класс FileP

public class FileP : FileOrFolder
    {
        public DateTime? LastWriteTime;
        //public long Size;
        public FileP(string fullname, DateTime? lastwritetime/*, long size*/)
            : base(fullname)
        {
            LastWriteTime = lastwritetime;
            //Size = size;
        }
        public bool Equals(FileP other)
        {
            return FullName == other.FullName && LastWriteTime == other.LastWriteTime;
        }
        public static List<FileP> NewFiles(List<FileP> Files1, List<FileP> Files2)
        {
            return Files2.Except(Files1, new NewFileP()).ToList();
        }
        public static List<FileP> ChangedFiles(List<FileP> Files1, List<FileP> Files2)
        {
            var New = NewFiles(Files1, Files2);
            var Change = Files2.Except(Files1, new ChangedFileP()).ToList();
            return Change.Except(New, new NewFileP()).ToList();
        }
        public override FileOrFolder Copy()
        {
            return new FileP(FullName, LastWriteTime/*, Size*/);
        }
    }
Answer 1

Как оказалось, наследование тут не при чем. Нельзя было приравнивать Comparator.files новой коллекции:

private void tvFiles_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            if (tvFiles.SelectedItem != null)
            {
                Comparator.files.Clear();
                Comparator.files.AddRange(((Folder)((TreeViewItem)tvFiles.SelectedItem).DataContext).Files);
                lvChildItems.Items.Refresh();
            }
        }
READ ALSO
c# задача коммивояжера

c# задача коммивояжера

Решаю задачу коммивояжера методом ветвей и границВозникла загвоздка, она не столько связана с кодом, сколько с пониманием алгоритма

306
как сделать нейронную простейшую сеть с 1 входом и 1 выходом

как сделать нейронную простейшую сеть с 1 входом и 1 выходом

Мне надо научить сеть делать что-то типо мат функцийТ

180
Moq объект для тестирования

Moq объект для тестирования

как для такого контекста правильно написать moq? PS

200