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