Дочерний элемент в TreeView не обновляется - PullRequest
0 голосов
/ 20 сентября 2010

Я скопировал базовый метод наличия флажка в виде дерева из официального набора инструментов Silverlight Флажки в примере TreeView .

Когда пользователь нажимает на родительский 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 ]

1 голос
/ 21 сентября 2010

Если вы хотите использовать 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));
    }
}

Надеюсь, это поможет, если вы пытались это сделать.

0 голосов
/ 20 сентября 2010

Попробуйте использовать ObservableCollection<ClientContract> вместо List<>. Обычно вместо этого вы хотите привязать данные к этому типу коллекции, когда данные динамические, чтобы они могли уведомлять пользовательский интерфейс об изменениях коллекции.

...