TreeView и привязка данных не удалось - PullRequest
0 голосов
/ 08 декабря 2018

Я работаю с шаблоном MVVM и TreeView.

Мне не удалось связать модели данных с представлением.Вот мой текущий код:

MainWindow.xaml:

xmlns:reptile="clr-namespace:Terrario.Models.Reptile"
...
<TreeView x:Name="TrvFamily" Grid.Row="1" Grid.Column="0" ItemsSource="{Binding }">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate DataType="{x:Type reptile:Family}" ItemsSource="{Binding Items}">
                    <TextBlock Text="{Binding Name}" />
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        LoadFamily();
    }

MainWindow.xaml.cs:

    private void LoadFamily()
    {
        FamilyVM familiesVM = new FamilyVM();
        familiesVM.Load();
        TrvFamily.DataContext = familiesVM;
    }
}

ViewModels \ FamilyVM:

class FamilyVM
{
    public ObservableCollection<Family> Families { get; set; }

    public void Load()
    {
        ObservableCollection<Family> families = new ObservableCollection<Family>();

        families.Add(new Family { ID = 1, Name = "Amphibian" });
        families.Add(new Family { ID = 2, Name = "Viperidae" });
        families.Add(new Family { ID = 3, Name = "Aranae" });

        Families = families;
    }
}

Models \ Family.cs

    class Family
{
    public int ID { get; set; }
    public string Name { get; set; }
}

TreeView по-прежнему белый, как и без данных.

Надеюсь, у вас возникли проблемы;)

Спасибо за аванс

1 Ответ

0 голосов
/ 08 декабря 2018

Вы привязаны к экземпляру FamilyVM, а не к Families.У него нет свойства Name, поэтому вы ничего не получите.

Вы также должны всегда реализовывать inotifypropertychanged в любой модели представления.В противном случае вы получаете утечку памяти.

И у вас нет дочерней коллекции в Family.

    <TreeView x:Name="TrvFamily" Grid.Row="1"
              ItemsSource="{Binding Families}">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate DataType="{x:Type local:Family}" ItemsSource="{Binding SomeCollectionYouDoNotHaveYet}">
                <TextBlock Text="{Binding Name}" />
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

Обычно помещают вещи inotifypropertyized в базовый класс, от которого вы наследуете модели представления.

class FamilyVM : INotifyPropertyChanged
{
    private ObservableCollection<Family> families = new ObservableCollection<Family>();

    public ObservableCollection<Family> Families
    {
        get { return families; }
        set { families = value; NotifyPropertyChanged(); }
    }

    public void Load()
    {
        ObservableCollection<Family> families = new ObservableCollection<Family>();
        families.Add(new Family { ID = 1, Name = "Amphibian" });
        families.Add(new Family { ID = 2, Name = "Viperidae" });
        families.Add(new Family { ID = 3, Name = "Aranae" });
        Families = families;
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
...