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

时间:2017-08-24 16:17:12

标签: c# wpf xaml mvvm treeview

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

但是,如果该孩子尚未展开,则子项中的复选框仅会更新为其父级的值。创建树后,如果我取消勾选顶部项目的复选框,则整个列表将被取消选中。但是,如果我展开并关闭一个孩子,然后勾选他们的父母的复选框,他们就不会直观地更新。

如果您需要更多信息,请与我们联系。

1 个答案:

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