c# - WPF:如何将通用数据绑定(bind)到 TreeView?

标签 c# wpf binding treeview

我有一个 TreeView,我想将一些数据绑定(bind)到它;我想为每种类型的数据显示不同的 TreeViewItem 布局并查看 this example我知道怎么做了。

到目前为止,我有以下类(class):

public class Category
{
    public string Name { get; set; }
    public List<Product> Products { get; set; }
}
public class Product
{
    public string Name { get; set; }
}

现在我需要使用这样的包装器来处理数据:

public class DataWrapper<T> where T : class
{

    public T Data { get; set; }
}

我想将这样创建的列表设置为 TreeView 的 ItemSource:

IList<DataWrapper<Category>> list = new List<DataWrapper<Category>>();

Category c = new Category() { Name = "C1", Products = new List<Product>() { new Product() { Name = "P1" }, new Product() { Name = "P2" } } };
list.Add(new DataWrapper<Category>() { Data = c });

c = new Category() { Name = "C2", Products = new List<Product>() { new Product() { Name = "P3" }, new Product() { Name = "P4" } } };
list.Add(new DataWrapper<Category>() { Data = c });

c = new Category() { Name = "C3", Products = new List<Product>() { new Product() { Name = "P5" }, new Product() { Name = "P6" } } };
list.Add(new DataWrapper<Category>() { Data = c });

所以我所做的是将 DataContext 设置为 treeView:

myTreeView.DataContext =list;

这是 xaml:

<TreeView x:Name="myTreeView">
        <TreeView.Resources>
            <HierarchicalDataTemplate DataType="{x:Type src:Category}" ItemsSource="{Binding Path=Data}">
                <StackPanel>
                    <TextBlock Text="Category:" />
                    <TextBlock Text="{Binding Path=Name}" />
                </StackPanel>
            </HierarchicalDataTemplate>
            <HierarchicalDataTemplate DataType="{x:Type src:Product}">
                <StackPanel>
                    <TextBlock Text="Product:" />
                    <TextBlock Text="{Binding Path=Name}" />
                </StackPanel>
            </HierarchicalDataTemplate>
        </TreeView.Resources>
    </TreeView>

但是它当然不起作用:) 谁能解释一下如何正确绑定(bind)此类对象列表?

谢谢

最佳答案

它不起作用的原因是您绑定(bind)了 ItemsSource到一个名为 Data 的属性关于DataContext其类型为 List<DataWrapper<Category>>并且没有这个属性。

我不太确定你需要这个 wrapper 做什么。最简单的方法是摆脱包装器,使列表成为项目类型 Category 的列表。并将此列表用作 ItemsSource :

IList<Category> list = new List<Category>();

Category c = new Category() { Name = "C1", Products = new List<Product>() { new Product() { Name = "P1" }, new Product() { Name = "P2" } } };
list.Add(c);

...

// Set this list as ItemsSource
myTreeView.ItemsSource=list;

这样就可以正确应用数据模板的类型绑定(bind)。

或者,如果您需要包装器,只需将包装器设为非通用即可:

public class CategoryWrapper
{
    public Category Data { get; set; }
}

并修改类别模板:

<HierarchicalDataTemplate DataType="{x:Type src:CategoryWrapper}" ItemsSource="{Binding Path=Data.Products}">
    <StackPanel>
        <TextBlock Text="Category:" />
        <TextBlock Text="{Binding Path=Data.Name}" />
    </StackPanel>
</HierarchicalDataTemplate>

使其成为非泛型的原因是,将泛型类型指定为 DataType 并不容易。模板的:

<!-- Doesn't work! -->
DataType="{x:Type src:DataWrapper<Category>}" 

希望这有帮助!如果此解决方案不适用于您的情况,请告诉我,我会再次查看...

关于c# - WPF:如何将通用数据绑定(bind)到 TreeView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29820698/

相关文章:

c# - 为什么操作方法 DeleteConfirmed 使用模型 ID 而不是模型对象作为其参数?

c# - WPF : How can i show my login window(project imported) before my application window?

wpf - 找不到引用 'ElementName=Field' 的绑定(bind)源

c# - 每个套接字地址仅使用一种

c# - 冲突的命名空间解析

c# - 如何中断应用程序中文本语音合成的播放?

wpf - 为什么 IsMouseOver 被识别而 MouseDown 不是(Wpf 样式触发器)?

jquery - 暂时禁用通过其他函数/插件附加的 jquery 事件

c# - 我怎样才能让我所有的按钮都在一个表单中,使其文本变成大写/小写?

WPF 本地化扩展 MVVM 绑定(bind)