2017-08-24 90 views
0

我有包含該類型TPDItem的項一個TreeView,每個TPDItem具有TPDItems的的ObservableCollection其中顯示以下述方式: TPDItem HierarchyWPF MVVM - 在樹視圖項之後不被更新被openened

該級別顯示哪些項目是哪些孩子的父母,1.1,1.2和1.3是具有級別1的項目的子項。

如果我勾選複選框導出,我要設置該項目的導出值,並且它是子項目它是兒童的孩子)遞歸地。 這是我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上使用setter,這將觸發視覺更新。

試試這個:

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 
     } 

    } 

而且,使私人的,而不是公衆的SetExported方法會避免這種類型的錯誤。

+0

男人,你是一個天才。這完全有道理!非常感謝你 –