在WPF中绑定TreeView

3
我正在尝试将模型中保存的对象集合绑定到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的数据上下文和绑定,但我仍然无法在树中看到任何项目。

<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;
    }
2个回答

3

我通过修改我的树状视图以绑定到复合视图模型的方式,如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;
    }

0

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引起的问题吗? - Johnathon Sullinger
你是如何填充筛选器的?看起来没有代码会填充它。 - 123 456 789 0
是的,MyObject 是从仓库中获取的。在将对象返回到 MainWindow 之前,仓库会从数据库中填充 FilterType 集合中的数据。这是在窗口加载方法中发生的。 - Johnathon Sullinger
我应该注意到,当我在Window_Loaded事件中使用调试器时,我可以验证集合中有数据。 - Johnathon Sullinger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接