gpt4 book ai didi

c# - WPF MVVM - Treeview 中的项目在打开后未更新

转载 作者:行者123 更新时间:2023-12-03 11:03:06 25 4
gpt4 key购买 nike

我有一个 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>

但是,如果子项尚未展开,子项中的复选框只会更新为其父项的值。创建树后,如果我取消选中顶部项目的复选框,则整个列表都会取消选中。但是,如果我展开和关闭一个 child ,然后勾选他们 parent 的复选框,他们不会在视觉上得到更新。

如果您需要更多信息,请告诉我。

最佳答案

因为你直接调用SetExported在 child 身上,您正在跳过调用 OnPropertyChanged 的 setter 部分.请注意 SetExported设置支持变量 isExported ,但从不在公共(public)属性 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 方法设为私有(private)而不是公有可以避免此类错误。

关于c# - WPF MVVM - Treeview 中的项目在打开后未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45866563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com