【问题标题】:Binding to a treeview in WPF绑定到 WPF 中的树视图
【发布时间】:2014-02-05 21:55:04
【问题描述】:

我正在尝试将模型持有的对象集合绑定到 WPF 中的树视图。我的 XML 是基于 WPF Treeview Databinding Hierarchal Data with mixed types,但我没有任何运气。

对于树视图,我当前的 XAML 看起来像这样。

    <TreeView Name="ConfigurationFilter">
        <TreeView.Resources>
            <HierarchicalDataTemplate DataType="{x:Type models:MyModel}"  ItemsSource="{Binding Path=Filters.FilterType1}">
                <StackPanel Orientation="Horizontal">
                    <CheckBox></CheckBox>
                    <Label Content="{Binding Path=Name}"></Label>
                </StackPanel>
            </HierarchicalDataTemplate>
        </TreeView.Resources>
    </TreeView>

我有一个看起来像这样的模型

public class MyModel
{
    public Observable<MyFilter> FilterType1 {get;set;}
    public Observable<MyFilter> FilterType2 {get;set;}
}

public class MyFilter
{
    public string Name {get;set;}
    public bool IsSelected {get;set;}
}

在我的 MainWindow.Xaml.cs 中,我有以下内容:

public partial class MainWindow : Window
{
    public MyModel Filters { get; set; }
}

FilterType1 属性中有 331 个项目。然而,当我运行应用程序时,绑定永远不会发生。我在 Treeview 中看不到任何项目。我做错了什么?

更新 1

我已按照建议将主窗口添加为树视图和绑定的数据上下文,但树中仍然没有任何项目

<TreeView Name="ConfigurationFilter" ItemsSource="{Binding Filters}">
        <TreeView.Resources>
            <HierarchicalDataTemplate DataType="{x:Type models:MyModel}"  ItemsSource="{Binding Path=Filters.FilterType1}">
                <StackPanel Orientation="Horizontal">
                    <CheckBox></CheckBox>
                    <Label Content="{Binding Path=Name}"></Label>
                </StackPanel>
            </HierarchicalDataTemplate>
        </TreeView.Resources>
    </TreeView>

还有我的 MainWindow.cs

    public MainWindow()
    {
        InitializeComponent();
        ConfigurationFilter.DataContext = this;
    }

【问题讨论】:

    标签: c# wpf xaml data-binding treeview


    【解决方案1】:

    我能够通过修改我的树视图以绑定到复合视图模型来实现此功能,如 on CodeProject 所示。

        <TreeView Grid.ColumnSpan="2" Grid.RowSpan="2">
            <TreeViewItem Header="Routes" Name="RouteView" ItemsSource="{Binding Routes}">
                <TreeViewItem.ItemTemplate>
                    <HierarchicalDataTemplate DataType="{x:Type viewModels:RouteViewModel}"  ItemsSource="{Binding}">
                        <StackPanel Orientation="Horizontal">
                            <Label Content="{Binding Path=Name}" VerticalAlignment="Center"></Label>
                        </StackPanel>
                    </HierarchicalDataTemplate>
                </TreeViewItem.ItemTemplate>
            </TreeViewItem>
        </TreeView>
    

    由于我的树视图将有多个预先确定的根节点,因此我必须将数据源绑定到每个根 TreeViewItem。然后我将我的对象放入复合视图模型中。

    复合视图模型

    public class DomainViewModel
    {
        public ReadOnlyCollection<RouteViewModel> Routes { get; set; }
        public ReadOnlyCollection<SkyViewModel> SkyLines { get; set; }
    
        public DomainViewModel(List<Route> routes)
        {
            Routes = new ReadOnlyCollection<RouteViewModel>(
                (from route in routes
                 select new RouteViewModel(route))
                 .ToList<RouteViewModel>());
        }
    
            Skylines = new ReadOnlyCollection<SkyViewModel>(
                (from route in routes
                 select new SkyViewModel(route))
                 .ToList<SkyViewModel>());
        }
    }
    

    ViewModel - 仅显示 1 个以提高可读性。

    public class RouteViewModel : INotifyPropertyChanged
    {
        private Route _route; // My actual database model.
    
        public string Name
        {
            get { return _route.RouteName; }
        }
    
        public RouteViewModel(Route route)
        {
            _route = route;
        }
    }
    

    主窗口

        public MainWindow()
        {
            InitializeComponent();
    
            this.DomainFilterTreeView.DataContext = new this.Domains;
        }
    

    【讨论】:

      【解决方案2】:

      TreeView 没有绑定到 ItemsSource。假设TreeViewDataContext 是你的MainWindow,那么你可以添加ItemsSource 绑定。

      <TreeView Name="ConfigurationFilter" ItemsSource={Binding Filters}>
          <TreeView.Resources>
              <HierarchicalDataTemplate DataType="{x:Type models:MyModel}"  ItemsSource="{Binding Path=Filters.FilterType1}">
                  <StackPanel Orientation="Horizontal">
                      <CheckBox></CheckBox>
                      <Label Content="{Binding Path=Name}"></Label>
                  </StackPanel>
              </HierarchicalDataTemplate>
          </TreeView.Resources>
      </TreeView>
      

      MainWindow.xaml.cs

      public partial class MainWindow : Window
      {
          public MainWindow()
          {
           ConfigurationFilter.DataContext = this;
          }
      
          public MyModel Filters { get; set; }
      }
      

      【讨论】:

      • 我试了一下,还是不行。我已经更新了我的问题,以使用您的示例显示我的 XAML 和 MainWindow.cs 代码。没有任何东西呈现给 UI。你认为这是我试图绑定到像 Filters.FilterType1 这样的对象中的属性的问题吗?
      • 如何填充过滤器?看起来没有代码会填充它。
      • 是的,MyObject 是从存储库中获取的。在将对象返回到 MainWindow 之前,存储库会使用数据库中的数据填充 FilterType 集合。这发生在窗口加载方法中
      • 我应该注意,当我在 Window_Loaded 事件中使用调试器时,我可以验证集合是否有数据。
      猜你喜欢
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 2010-11-03
      • 2015-07-10
      • 2011-07-14
      • 1970-01-01
      相关资源
      最近更新 更多