2015-01-29 2 views
1

я реализовал модель дерева, как это:WPF TreeView обновления, когда источник обновления для модели дерева

public class Node 
{ 

    public NodeValue Item { get; set; } 

    public Node Parent { get; set; } 

    public List<Node> Children { get; set; } 
} 

И я показал эти узлы в WPF TreeView.

<TreeView Name="MainTreeview" HorizontalAlignment="Left" Height="auto" VerticalAlignment="Top" Width="200" ItemsSource="{Binding UpdateSourceTrigger=PropertyChanged}" SelectedItemChanged="MainTreeview_SelectedItemChanged" > 
      <TreeView.ItemTemplate> 
       <HierarchicalDataTemplate DataType="{x:Type local2:Node}" ItemsSource="{Binding Path=Children, Mode=OneWay}"> 
        <TreeViewItem Header="{Binding Path=Name}"/> 
       </HierarchicalDataTemplate> 
      </TreeView.ItemTemplate> 
      <TreeView.ItemContainerStyle> 
       <Style TargetType="{x:Type TreeViewItem}"> 
        <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" /> 
        <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> 
        <Setter Property="FontWeight" Value="Normal" /> 
        <Style.Triggers> 
         <Trigger Property="IsSelected" Value="True"> 
          <Setter Property="FontWeight" Value="Bold" /> 
         </Trigger> 
        </Style.Triggers> 
       </Style> 
      </TreeView.ItemContainerStyle> 
     </TreeView> 

Моя проблема в том, что я не могу обновить представление после обновления модели. Я не понимаю из других статей, как обновлять пользовательский интерфейс, потому что они слишком сложны. Теперь я знаю, что есть 2 возможных пути:

  1. Использование свойств зависимостей: Я понял, как они работают, но я не знаю, как применить их к моей модели.

  2. Использование триггеров событий, но я также не знаю, как применить их к моей проблеме.

Пожалуйста, помогите!

ответ

1

Просто используйте свой узел INotifyPropertyChanged и используйте ObservableCollections вместо незаметных списков.

Частичная реализация, чтобы вы на своем пути ...

public class Node : INotifyPropertyChanged 
{ 
    private Node _parent; 
    public Node Parent 
    { 
     get 
     { 
      return this._parent; 
     } 

     set 
     { 
      if (value != this._parent) 
      { 
       this._parent= value; 
       NotifyPropertyChanged(); 
      } 
     } 
    } 

    public ObservableCollection<Node> Children { get; } = new ObservableCollection<Node>() 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     PropertyChanged?(this, new PropertyChangedEventArgs(propertyName)); 
    } 

} 
+0

Чтобы сделать реализацию этого еще проще, получить [PropertyChanged от Fody] (https://github.com/Fody/PropertyChanged) (также доступны через NuGet) и добавить '[PropertyChanged.ImplementPropertyChanged]' перед определением вашего класса ('public class Node()') – DdW

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