2015-10-16 106 views
0

为什么当我在xaml中设置itemsource时,我的wpf treeview不显示内容?它似乎只显示数据时,我用这个绑定项目wpf treeview显示什么?

trvFamilies.ItemsSource = families; 

是它也许不是更新,因为我不是触发,并在XAML莫名其妙更新在CS文件中设置该属性?我不知道该如何改变才能正常工作。

ViewModel.cs

using System; 
using System.Collections.ObjectModel; 
using System.Windows; 
using System.Windows.Input; 

namespace WpfApplication1 
{ 
    public class ViewModel : ObservableObject 
    { 
     private ObservableCollection<Family> families; 
     public ObservableCollection<Family> Families 
     { 
      get { return families; } 
      set 
      { 
       families = value; 
       NotifyPropertyChanged("Families"); 
      } 
     } 

     public ViewModel() 
     { 
      // FAMILIES 
      Family family1 = new Family() { Name = "The Doe's" }; 
      family1.Members.Add(new FamilyMember() { Name = "John Doe", Age = 42 }); 
      family1.Members.Add(new FamilyMember() { Name = "Jane Doe", Age = 39 }); 
      family1.Members.Add(new FamilyMember() { Name = "Sammy Doe", Age = 13 }); 
      Families.Add(family1); 

      Family family2 = new Family() { Name = "The Moe's" }; 
      family2.Members.Add(new FamilyMember() { Name = "Mark Moe", Age = 31 }); 
      family2.Members.Add(new FamilyMember() { Name = "Norma Moe", Age = 28 }); 
      Families.Add(family2); 
     } 
    } 

    public class Family 
    { 
     public Family() 
     { 
      this.Members = new ObservableCollection<FamilyMember>(); 
     } 

     public string Name { get; set; } 

     public ObservableCollection<FamilyMember> Members { get; set; } 
    } 

    public class FamilyMember 
    { 
     public string Name { get; set; } 

     public int Age { get; set; } 
    } 
} 

ObservableObject.cs

using System; 
using System.ComponentModel; 
using System.Runtime.CompilerServices; 

namespace WpfApplication1 
{ 
    public class ObservableObject : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     public void NotifyPropertyChanged([CallerMemberName] string propertyName = null) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 
} 

MainWindow.xaml

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:self="clr-namespace:WpfApplication1" 
     Title="MainWindow" Height="350" Width="300" 
     WindowStartupLocation="CenterScreen"> 
    <Grid Margin="5"> 

     <TreeView Name="trvFamilies" ItemsSource="{Binding self:families}" Grid.Row="1" Grid.ColumnSpan="2"> 
      <TreeView.Resources> 
       <HierarchicalDataTemplate DataType="{x:Type self:Family}" ItemsSource="{Binding Members}"> 
        <StackPanel Orientation="Horizontal"> 
         <Label VerticalAlignment="Center" FontFamily="WingDings" Content="1"/> 
         <TextBlock Text="{Binding Name}" /> 
        </StackPanel> 
       </HierarchicalDataTemplate> 
       <DataTemplate DataType="{x:Type self:FamilyMember}"> 
        <StackPanel Orientation="Horizontal"> 
         <Label VerticalAlignment="Center" FontFamily="WingDings" Content="2"/> 
         <TextBlock Text="{Binding Name}" /> 
        </StackPanel> 
       </DataTemplate> 
      </TreeView.Resources> 
     </TreeView> 

    </Grid> 
</Window> 
+0

你现在必须绑定到你的ViewModel,而不是你的窗口,检查调试输出,可能会说家庭不存在(了)自我 – Icepickle

回答

0

铜rrently你的绑定到公共领域:

public List<Family> families 

但绑定源(数据)需要是一个公共属性。 对于集合类型,在WPF中您通常使用一个ObservableCollection

所以,你的属性更改为:

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


附加信息:

通常属性绑定到不不驻留在视图类(这里:不在你的窗口),而是在一个名为“视图模型”的单独类中执行INotifyPropertyChanged接口。

看看这里的更多信息:Model-View-ViewModel-MVVM-Explained

最后,您的视图模型应该是这样的:

public ObservableCollection<Family> Families 
{ 
    get { return _families; } 
    set 
    { 
     _families= value; 
     RaisePropertyChanged("Families"); 
    } 
} 
public ObservableCollection<Family> _families; 

protected void RaisePropertyChanged(string propertyName) 
{ 
    PropertyChangedEventHandler handler = PropertyChanged; 
    if (handler != null) 
    { 
     handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

public event PropertyChangedEventHandler PropertyChanged;  

有了新的视图模型类,绑定可以改变到

ItemsSource="{Binding Families}" 

最后,您需要为您设定新的视图模型类作为DataContext的在你的窗前,看到here

+0

你能修改我的代码来演示看起来像什么? – JokerMartini

+0

谢谢,我欣赏它。 – JokerMartini

+0

我总是会建议'ObservableCollection '是私有声明的并且实例化为只读,并且没有公共setter,因此人们只能清除列表或添加项目,它并不真的需要RaisePropertyChanged调用案例 – Icepickle