我有一个TreeView,其中包含TPDItem类型的项目,每个TPDItem都有一个TPDItems的 ObservableCollection ,它们以下列方式显示: TPDItem Hierarchy
该级别显示哪些项目是哪些项目的子项,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>
但是,如果该孩子尚未展开,则子项中的复选框仅会更新为其父级的值。创建树后,如果我取消勾选顶部项目的复选框,则整个列表将被取消选中。但是,如果我展开并关闭一个孩子,然后勾选他们的父母的复选框,他们就不会直观地更新。
如果您需要更多信息,请与我们联系。
答案 0 :(得分:2)
因为您直接在子项上调用SetExported
,所以您正在跳过调用OnPropertyChanged
的setter部分。请注意,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方法设为私有而不是公共方法可以避免此类错误。