【问题标题】:TreeView and databinding failedTreeView 和数据绑定失败
【发布时间】:2019-05-10 04:38:55
【问题描述】:

我正在研究 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 仍然是白色的,就像没有数据一样。

希望你有问题;)

提前致谢

【问题讨论】:

    标签: c# wpf mvvm data-binding observablecollection


    【解决方案1】:

    您正在绑定到 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>
    

    通常将 inotifypropertychanged 的​​东西放在继承视图模型的基类中。

    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));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-09
      • 2013-02-05
      • 2014-10-19
      • 2018-03-20
      • 2011-09-12
      • 1970-01-01
      相关资源
      最近更新 更多