TreeView中的子项不更新

时间:2010-09-20 13:33:05

标签: silverlight binding silverlight-4.0 treeview

我从官方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<ClientContract>并使用与链接示例中相同的代码。

ClientContract对象是:

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

当基础List<ClientContract>对象更新时,如何强制孩子重绘自己?

2 个答案:

答案 0 :(得分: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));
    }
}

我希望如果这是你想做的事情会有所帮助。

答案 1 :(得分:0)

尝试使用ObservableCollection<ClientContract>代替List<>。通常,当数据是动态的时,您希望数据绑定到此集合类型,以便它可以通知UI集合更改。