TreeViewItem с привязкой данных, Childs не обновляется - PullRequest
0 голосов
/ 02 сентября 2011

У меня есть Treeview с иерархическим шаблоном. Все отлично работает Все объекты будут отвечать, как ожидалось. Но добавление элементов в коллекцию не обновляет древовидную структуру.

Мой базовый объект привязан к дереву. Одно из его свойств содержит коллекцию. И эта коллекция имеет свойство с собственной коллекцией.

BaseObject
  -> Sub Collection 1
      -> SubCollection 2

Мой BaseObject реализовал INotifyPropertyChanged, а моя SubCollection 2 - ICollectionChaged.

Тем не менее, когда я пытаюсь добавить новый элемент в SubCollection 2, вызывается OnCollectionChaged, но CollectionChanged остается нулевым, поэтому ничего не происходит.

Шаблоны TreeView:

<HierarchicalDataTemplate x:Key="SheetTreeTemplate" >
    <StackPanel Orientation="Horizontal">
        <Image Width="16" Height="16" Margin="3,0" Source="/Resources/Icons/page_green.png" />
        <TextBlock FontStyle="Italic">
            <TextBlock.Text>
                <MultiBinding StringFormat="{}Seite {0}">
                    <Binding Path="Name"/>
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>
    </StackPanel>
</HierarchicalDataTemplate>

<HierarchicalDataTemplate x:Key="DocumentTreeTemplate" ItemsSource="{Binding Path=Sheets.Values}" ItemTemplate="{StaticResource SheetTreeTemplate}">
    <StackPanel Orientation="Horizontal">
        <Image Width="16" Height="16" Margin="3,0" Source="/Resources/Icons/folder.png" />
        <TextBlock FontStyle="Italic">
            <TextBlock.Text>
                <MultiBinding StringFormat="{}{0} {1}">
                    <Binding Path="DocTypName"/>
                    <Binding Path="ID"/>
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>
    </StackPanel>
</HierarchicalDataTemplate>


<HierarchicalDataTemplate x:Key="PileTreeTemplate" ItemsSource="{Binding Path=Documents.Values}" ItemTemplate="{StaticResource DocumentTreeTemplate}">
    <StackPanel Orientation="Horizontal">
        <Image Width="16" Height="16" Margin="3,0" Source="/Resources/Icons/report.png" />
        <TextBlock FontStyle="Italic" Text="{Binding Path=Name}" />
    </StackPanel>
</HierarchicalDataTemplate>

Сам TreeView:

<TreeView Style="{DynamicResource NavigationTree}" Name="tvw_mainMenu"  ItemsSource="{Binding Values}" ItemTemplate="{DynamicResource PileTreeTemplate}" SelectedItemChanged="tvw_mainMenu_SelectedItemChanged"/>

Изменен класс, который должен подписаться на SubCollection 2:

class Sheets : Dictionary<String, Sheet> , INotifyCollectionChanged {

    public bool Add(String sKey, Sheet newSheet) {

            base.Add(sKey, newSheet);
            OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, new KeyValuePair<String, Sheet>(sKey, newSheet)));

      }
      public event NotifyCollectionChangedEventHandler CollectionChanged;

      protected virtual void OnCollectionChanged(NotifyCollectionChangedEventArgs e) {
         if (CollectionChanged != null) {
            CollectionChanged(this, e);
         }
      }
}

1 Ответ

0 голосов
/ 15 сентября 2011

Я обнаружил, что существует гораздо больше интерфейсов для реализации. Лучший способ - это наблюдаемая коллекция. Потому что я не хочу менять все мои классы, которые я нашел ObservableDictionary Пример.

...