2017-08-24 14 views
0

をopenenedされた後に更新されていない、私はタイプTPDItemの項目が含まれているツリービューを持って、各TPDItemは、次のように表示されTPDItemsののObservableCollectionがあります TPDItem HierarchyWPF MVVM - ツリービュー内の項目

レベルは、レベル1のアイテムの子である1.1,1.2,1.3の子であるアイテムを示します。

チェックボックスをオンにすると、そのアイテムのエクスポート値を設定する必要があります。それは再帰的に子どもの子供です)。 これは私のTPDItemクラスです:

public class TPDItem : INotifyPropertyChanged 
{ 
    public List<string> LevelArr { get; } 
    public string Level { get; } 
    public string _12NC { get; } 
    private string pn; 
    public string Description { get; } 

    private ObservableCollection<TPDItem> children = new ObservableCollection<TPDItem>(); 


    private bool isExported = true; 

    public bool IsExported 
    { 
     get { return isExported; } 
     set 
     { 
      SetExported(value); 
      OnPropertyChanged("IsExported"); 
     } 
    } 

    public string PN 
    { 
     get { return pn; } 
     set { pn = value; } 
    } 

    public ObservableCollection<TPDItem> Children 
    { 
     get 
     { 
      return children; 
     } 
    } 

    public void SetExported(bool exported) 
    { 
     isExported = exported; 
     foreach (TPDItem item in Children) 
     { 
      item.SetExported(exported); 
     } 

    } 
} 

そして、これは私の関連するTreeViewコントロールのXAMLコードです:

<TreeView ItemsSource="{Binding Hierarchy}" Margin="10,0,10,0" Height="243" > 
    <TreeView.Resources> 
      <HierarchicalDataTemplate ItemsSource="{Binding Children}" DataType="{x:Type models:TPDItem}"> 
       <Grid > 
        <TextBlock Text="{Binding Level}"/> 
        <TextBlock Text="{Binding _12NC}" Margin="{Binding Margins._12NC}"/> 
        <TextBlock Text="{Binding PN}" Margin="{Binding Margins.PN}"/> 
        <TextBlock Text="{Binding Description}" Margin="{Binding Margins.Description}"/> 
        <CheckBox Content="Export" Margin="{Binding Margins.CheckBox}" IsChecked="{Binding IsExported, Mode=TwoWay}" /> 
       </Grid> 
      </HierarchicalDataTemplate> 
    </TreeView.Resources> 
</TreeView> 

ただし、チェックボックスが子供にだけ子供がいないことを場合、親の値に更新されますまだ展開されていませんツリーを作成した後、先頭のアイテムのチェックボックスを解除すると、リスト全体がアンティッキになります。ただし、子を展開して閉じると親のチェックボックスにチェックを入れても、視覚的に更新されることはありません。

詳細情報が必要な場合はお知らせください。

答えて

2

SetExportedを子供に直接呼び出すため、OnPropertyChangedを呼び出すセッターの部分をスキップしています。 SetExportedは、バッキング変数isExportedを設定しますが、パブリックプロパティIsExportedでは決して設定ツールを使用しません。これはビジュアル更新をトリガーするものです。代わりに、公共の民間SetExported方法は、バグのこのタイプを避けるだろう作り、また

public void SetExported(bool exported) 
    { 
     isExported = exported; 
     foreach (TPDItem item in Children) 
     { 
      // this will call the SetExported method, but will also trigger OnPropertyChanged 
      item.IsExported = exported 
     } 

    } 

はこれを試してみてください。

+0

男、あなたは天才です。そしてそれは完全に理にかなっています!たくさんありがとう –

関連する問題