【问题标题】:Child item in TreeView not updatingTreeView 中的子项未更新
【发布时间】:2011-04-14 16:42:02
【问题描述】:

我从官方 Silverlight 工具包 Checkboxes in a TreeView example 复制了在树视图中添加复选框的基本方法。

当用户单击父 TreeViewItem 时,我希望检查所有子项,如上例所示。这在父级折叠时工作正常,单击复选框会在父级中打勾,当您展开节点时,所有子级都会在复选框中打勾。

但是,如果扩展父级,则它不起作用。尽管基础数据列表已更新,但所有子项均未更新以在复选框中打勾。

我的 XAML 如下:

<sdk:HierarchicalDataTemplate x:Key="NodeTemplate" ItemsSource="{Binding Path=Contracts}">
    <StackPanel Orientation="Horizontal" ToolTipService.ToolTip="{Binding Path=Name}">
        <CheckBox IsTabStop="False" IsThreeState="{Binding Path=HasContracts}" IsChecked="{Binding Path=Selected, Mode=TwoWay}" Click="CheckBox_Click" />
        <TextBlock Text="{Binding Path=Name}" Tag="{Binding Path=ID}"/>
    </StackPanel>
</sdk:HierarchicalDataTemplate>

    <sdk:TreeView x:Name="tvClientContract" ItemsSource="{Binding Path=ClientContracts, Mode=TwoWay}" ItemTemplate="{StaticResource NodeTemplate}"/>

这绑定到 List&lt;ClientContract&gt; 并使用与链接示例中相同的代码。

ClientContract 对象是:

public int ID { get; set; }
public string Name { get; set; }
public List<ClientContract> Contracts { get; set; }
public bool? Selected { get; set; }

当底层List&lt;ClientContract&gt; 对象更新时,如何强制孩子重新绘制自己?

【问题讨论】:

    标签: silverlight binding silverlight-4.0 treeview


    【解决方案1】:

    如果您想使用 INotifyPropertyChange(我所做的而不是使用 ObservableCollection),那么您可以按照示例对 ID 元素执行此操作:

    public class myclass : INotifyPropertyChanged
    {
        private int id_Value;
        public int ID
        {
            get { return id_Value; }
            set
            {
                id_Value = value;
                NotifyPropertyChanged("ID");
            }
        }
    
        public string Name { get; set; }
        public List<ClientContract> Contracts { get; set; }
        public bool? Selected { get; set; }
    
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(string name)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }
    

    如果这是您尝试做的事情,我希望这会有所帮助。

    【讨论】:

    • 我在整个集合上引发了 NotifyPropertyChanged 事件,而不是单个属性。谢谢。
    【解决方案2】:

    尝试使用ObservableCollection&lt;ClientContract&gt; 而不是List&lt;&gt;。通常,当数据是动态的时,您希望将数据绑定到此集合类型,以便它可以通知 UI 集合更改。

    【讨论】:

    • 刚试了一下,恐怕没什么区别。我正在我的虚拟机中实现 INotifyPropertyChange。正如我所说,实际 List 中的值正在设置中,只是 UI 没有更新。
    猜你喜欢
    • 2018-02-02
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多