【问题标题】:C# XAML MVVM Treeview control Data BindingC# XAML MVVM Treeview 控件数据绑定
【发布时间】:2017-07-06 07:31:30
【问题描述】:

我无法显示项目列表。 我做错了什么?

XAML(视图):

<Grid.DataContext>
     <vm:MainViewModel />
</Grid.DataContext>

<Grid.Resources>
     <DataTemplate x:Key="Remedy">
       <TextBlock Text="{Binding Titulo}" />
     </DataTemplate>

     <HierarchicalDataTemplate x:Key="Laboratorio"
                              ItemTemplate="{StaticResource Remedy}"
                              ItemsSource="{Binding Items}">
         <TextBlock Text="{Binding Titulo}" />
     </HierarchicalDataTemplate>
     <HierarchicalDataTemplate x:Key="Root"
                               ItemTemplate="{StaticResource Laboratorio}"
                               ItemsSource="{Binding Items}">
         <TextBlock Text="{Binding Titulo}" />
     </HierarchicalDataTemplate>

</Grid.Resources>

<TreeView x:Name="dirR"
          ItemsSource="{Binding Path=Arbol}"
          ItemTemplate="{StaticResource Root}">
</TreeView>

C#(视图模型):

class MainViewModel:INotifyPropertyChanged
{
   private TreeItem _arbol = new TreeItem("Remedys");
   public TreeItem Arbol
   {
      set 
      { 
         _arbol = value; 
         OnPropertyChanged("Arbol"); 
      }
         get { return _arbol; }
   }

   public MainViewModel()
   {
       //Populate Arbol
       ...
    }
}

C#(模型):

public class TreeItem:INotifyPropertyChanged
{
    private String _titulo;
    private ObservableCollection<TreeItem> _items;
    public String Titulo
    {
        get { return _titulo; }
        set 
        {
            _titulo = value;
            OnPropertyChanged("Titulo");
        } 
    }
    public ObservableCollection<TreeItem> Items
    {
        get { return _items; }
        set 
        {
            _items = value;
            OnPropertyChanged("Items");
        }
    }
    public TreeItem(String __titulo) 
    {
        Titulo = __titulo;
    }

C#(主窗口 v1):

public MainWindow()
{
    InitializeComponent();

}

C# (MainWindow v2) 这个版本工作正常,但我不喜欢它,因为 View 和 Viewmodel 之间存在代码依赖关系

public MainWindow()
{
    InitializeComponent();

    MainViewModel vm = new MainViewModel();
    dirR.Items.Add(vm.Arbol);
}

【问题讨论】:

  • 请在阅读"How do I ask a good question?"页面后编辑您的问题。
  • 你必须在你的 MainWindow 中设置 DataContext = new MainViewModel();
  • 这个问题真的是关于 TreeView 绑定的吗?还是关于解耦代码?

标签: c# wpf xaml mvvm treeview


【解决方案1】:

您只能将值绑定到实现IEnumerableItemsSource。一般来说,您必须将集合绑定到ItemsSource

将您的 MainViewModel 更改为

class MainViewModel:INotifyPropertyChanged
{
   private ObservableCollection<TreeItem> _arbol = 
       new ObservableCollection<TreeItem>( 
           new List<TreeItem>
           { 
               new TreeItem("Remedys") 
           } );
   public ObservableCollection<TreeItem> Arbol
   {
      set 
      { 
         _arbol = value; 
         OnPropertyChanged("Arbol"); 
      }
         get { return _arbol; }
   }

   public MainViewModel()
   {
       //Populate Arbol
       ...
    }
}

【讨论】:

    【解决方案2】:

    在 MainWindow 代码中设置 DataContext:

    来自 XAML:

    <Window.DataContext>
      <vm:MainWindowViewModel/>
    </Window.DataContext>
    

    来自代码:

    public MainWindow()
    {
       InitializeComponent();
    
      DataContext = new MainViewModel();
    }
    

    【讨论】:

      猜你喜欢
      • 2011-03-16
      • 2014-08-09
      • 1970-01-01
      • 2016-05-29
      • 1970-01-01
      • 1970-01-01
      • 2018-07-27
      • 2011-08-11
      • 2021-11-22
      相关资源
      最近更新 更多