2016-06-25 7 views
3

ツリービューでは正常に動作しません:バインディング下図のように、私は<code>Employee</code>クラスを持っているWPF

public class Employee : INotifyPropertyChanged 
    { 
     public Employee() 
     { 
      _subEmployee = new ObservableCollection<Employee>(); 
     } 

     public string Name { get; set; } 

     public ObservableCollection<Employee> SubEmployee 
     { 
      get { return _subEmployee; } 
      set 
      { 
       _subEmployee = value; 
       NotifiyPropertyChanged("SubEmployee"); 
      } 
     } 

     ObservableCollection<Employee> _subEmployee; 

     public event PropertyChangedEventHandler PropertyChanged; 
     void NotifiyPropertyChanged(string property) 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(property)); 
     } 
    } 

私はメインウィンドウコンストラクタ で従業員クラスのコレクションを作成し、従業員の監視可能なコレクションにそれを追加してい示すように、以下:

public partial class MainWindow : Window 
    { 
     public ObservableCollection<Employee> Emp { get; private set; } 
     public MainWindow() 
     { 
      InitializeComponent(); 
      Emp = new ObservableCollection<Employee>(); 
      Emp.Add(new Employee(){Name = "Anuj"}); 
      Emp.Add(new Employee() { Name = "Deepak" }); 
      Emp.Add(new Employee() { Name = "Aarti" }); 

      Emp[0].SubEmployee.Add(new Employee(){Name = "Tonu"}); 
      Emp[0].SubEmployee.Add(new Employee() { Name = "Monu" }); 
      Emp[0].SubEmployee.Add(new Employee() { Name = "Sonu" }); 

      Emp[2].SubEmployee.Add(new Employee() { Name = "Harsh" }); 
      Emp[2].SubEmployee.Add(new Employee() { Name = "Rahul" }); 
      Emp[2].SubEmployee.Add(new Employee() { Name = "Sachin" }); 
      this.DataContext = this; 
     }  
    } 

私は自己としてDataContextを設定しました。以下に示すように今、XAMLファイルで、私はツリービューとバインドされるデータの階層的なテンプレートを作成している :

<Window x:Class="WpfApplication3.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <TreeView ItemsSource="{Binding}"> 
      <TreeView.ItemTemplate> 
       <HierarchicalDataTemplate ItemsSource="{Binding SubEmployee}"> 
        <TextBlock Text="{Binding Name}" /> 
       </HierarchicalDataTemplate> 
      </TreeView.ItemTemplate> 
     </TreeView> 

    </Grid> 
</Window> 

私は続けるとき、TreeView ItemsSource="{Binding Emp}"、 正しく作品を結合し、私が実行した後、ツリービュー構造を見ることができますコード。 しかし、私がTreeView ItemsSource="{Binding}"のままにしておくと、コードを実行した後に結果が表示されません。

私の理解では、ItemSource = "{Binding}"を保存することは、現在のdatacontextの評価値にバインドしていることを意味します。 私のdatacontextがselfに設定されているので、ItemSource = "{Binding}"はDataContextの唯一のプロパティ、つまりEmpにバインドしていることを意味するはずです。

バインディングを維持する際の問題を理解するのを手伝ってください ItemSource = "{Binding}"

+1

なぜあなたのデータコンテキストの「単一」プロパティにバインドする必要があると思いますか? WPFには、コントロールのDataContextの単一のプロパティに強制的にバインドするような規則はありません。 2.あなたの 'MainWindow'は、標準の' Window'から全て継承されていますが、実際には 'Emp'よりもはるかに多くのプロパティを持っています。 –

答えて

5

"私の理解では、ItemSource = "{Binding}"を保存することは、現在のdatacontextの評価値にバインドしていることを意味します。

正しいANDが問題です。 ItemsSourceは、バインディングソースのタイプがIEnumerableであると想定していますが、Windowにバインドしています。

"...私はDataContextすなわちEmpの唯一のプロパティにバインドしており、適切な結果が得られるはずです。"

いいえWPFのバインド規則では、このような「単一プロパティ」の前提はありません。

変更...

this.DataContext = this; 

へ...

this.DataContext = Emp; 

あるいは、XAMLでバインディングを変更し、Pathを使用してバインドするのDataContextに正しいメンバーを指定して...

<TreeView ItemsSource="{Binding Path=Emp}"> 
関連する問題