【问题标题】:WPF MVVM - items in Treeview not being updated after being openenedWPF MVVM - Treeview 中的项目在打开后未更新
【发布时间】:2018-02-02 15:04:39
【问题描述】:

我有一个包含 TPDItem 类型项目的 TreeView,每个 TPDItem 都有一个 ObservableCollection 的 TPDItems,它们以下列方式显示: 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>

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

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

【问题讨论】:

    标签: c# wpf xaml mvvm treeview


    【解决方案1】:

    因为您直接在孩子上调用SetExported,所以您正在跳过调用OnPropertyChanged 的setter 部分。请注意,SetExported 设置了支持变量 isExported,但从不使用公共属性 IsExported 上的设置器,这会触发视觉更新。

    试试这个:

        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 方法设为私有而不是公共可以避免此类错误。

    【讨论】:

    • 伙计,你是个天才。这完全有道理!非常感谢你
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    相关资源
    最近更新 更多