2014-02-20 5 views
2

Im новое для WPF и проблема. Я должен реализовать GUI для модели. В этой модели есть скобки, документы, листы и изображения. Каждый кронштейн может содержать больше скобок или документов. Каждый документ может содержать листы. На каждом листе есть изображение. Каждый элемент содержит дочерние элементы в списке. Итак, в скобках есть список скобок и документов, документа список листов ... Итак, у меня есть HierarchicalDataTemplate для этой структуры, и она работает.WPF TreeView со списком

Но теперь я хочу редактировать данные (перемещать или удалять некоторые элементы). Я понятия не имею, как сообщить дереву обновить.

Теперь я ObservableCollection, и я использую их для корневых скобок (потому что его не проблема, чтобы получить их там), но я не хочу проходить через каждую скобку, каждый документ и каждый лист и делать каждый список на моем пути ObservableCollection.

Могу ли я уведомить свое дерево об изменениях, скажем, в листе списка?

Мой Вью (не все, но важные вещи)

<DockPanel.Resources> 
    <HierarchicalDataTemplate DataType="{x:Type m:Bracket}" ItemsSource="{Binding Path=Items}"> 
     <TextBlock Text="{Binding Name}"></TextBlock> 
    </HierarchicalDataTemplate> 
    <HierarchicalDataTemplate DataType="{x:Type m:Document}" ItemsSource="{Binding Path=Sheets}"> 
     <TextBlock Text="{Binding Name}"></TextBlock> 
    </HierarchicalDataTemplate> 
    <HierarchicalDataTemplate DataType="{x:Type m:Sheet}" ItemsSource="{Binding Path=Images}"> 
     <TextBlock Text="{Binding Name}"></TextBlock> 
    </HierarchicalDataTemplate> 
    <HierarchicalDataTemplate DataType="{x:Type m:IPSImage}"> 
     <Image Source="{Binding ImageUri}" Width="150" Margin="0,5,0,0"></Image> 
    </HierarchicalDataTemplate> 
    </DockPanel.Resources> 

    <ToolBar DockPanel.Dock="Top"> 
    <Button Command="{Binding OpenAllCommand}">Alle Öffnen</Button> 
    <Button Command="{Binding MoveItemUpCommand}">Nach Oben</Button> 
    </ToolBar> 

    <TreeView ItemsSource="{Binding Path=Brackets}" Height="Auto" BorderThickness="0" DockPanel.Dock="Top" VerticalAlignment="Top"> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="TreeViewItem"> 
      <Setter Property="IsExpanded" Value="{Binding Path=DataContext.ExpandTreeViewItems, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" /> 
     </Style> 
    </TreeView.ItemContainerStyle> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="SelectedItemChanged"> 
      <cmd:EventToCommand Command="{Binding SelectedItemChangedCommand}" PassEventArgsToCommand="True"></cmd:EventToCommand> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
    </TreeView> 

ViewModel:

// Каждый кронштейн создает новые документы и каждый документ создает новые листы в конструкторе

private ObservableCollection<Bracket> m_Brackets; 
     public TreeViewModel() 
     { 
     m_Brackets = new ObservableCollection<Bracket>(); 
     m_Brackets.Add(new Bracket()); 
     if (m_Brackets[0] != null) 
     { 
      m_Brackets[0].Brackets.Add(new Bracket(m_Brackets[0].Id)); 
     } 
     m_Brackets.Add(new Bracket()); 
     } 

Поэтому, когда я удаляю лист в m_Brackets/Documents, ничего не происходит. Я пытаюсь вызвать RaisePropertyChanged («Таблицы»), но ничего.

Когда я вызываю Tree.Items.Refresh() все в порядке, но я думаю, что это невозможно или?

Спасибо за каждый Помощь Daniel

ответ

0

Если вы хотите, чтобы дерево, чтобы обновить себя, то у вас нет выбора, кроме как использовать ObservableCollections повсюду.

Ваш RaisePropertyChanged("Sheets") игнорируется, потому что WPF достаточно умен, чтобы сравнить ссылку на объект, чтобы увидеть, действительно ли оно изменилось. Вы не упоминаете, как вы храните коллекцию листов и т. Д., Но для того, чтобы увидеть какое-либо обновление с помощью события изменения вручную, вам придется поменять всю коллекцию на новую.

+0

Спасибо Я попытаюсь реализовать все с ObservableCollection. Я думаю, что это самый простой (и, возможно, единственный) способ сделать это. Спасибо за помощь – user3333428

Смежные вопросы