【问题标题】:Display multiple types from a single list in a WPF ListBox?从 WPF ListBox 中的单个列表显示多种类型?
【发布时间】:2010-08-03 20:31:19
【问题描述】:

我有一个包含两种不同类型的ObservableCollection<Object>

我想将此列表绑定到 ListBox 并为遇到的每种类型显示不同的 DataTemplates。我不知道如何根据类型自动切换数据模板。

我曾尝试使用 DataTemplate 的 DataType 属性并尝试使用 ControlTemplates 和 DataTrigger,但无济于事,要么没有显示,要么声称找不到我的类型...

下面的示例尝试:

我现在只有一个数据模板连接到 ListBox,但即使这样也不起作用。

XAML:

<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Resources>
    <DataTemplate x:Key="PersonTemplate">
        <TextBlock Text="{Binding Path=Name}"></TextBlock>
    </DataTemplate>

    <DataTemplate x:Key="QuantityTemplate">
        <TextBlock Text="{Binding Path=Amount}"></TextBlock>
    </DataTemplate>

</Window.Resources>
<Grid>
    <DockPanel>
        <ListBox x:Name="MyListBox" Width="250" Height="250" 
ItemsSource="{Binding Path=ListToBind}"
ItemTemplate="{StaticResource PersonTemplate}"></ListBox>
    </DockPanel>
</Grid>
</Window>

代码背后:

public class Person
{
    public string Name { get; set; }

    public Person(string name)
    {
        Name = name;
    }
}

public class Quantity
{
    public int Amount { get; set; }

    public Quantity(int amount)
    {
        Amount = amount;
    }
}

public partial class Window1 : Window
{
    ObservableCollection<object> ListToBind = new ObservableCollection<object>();

    public Window1()
    {
        InitializeComponent();

        ListToBind.Add(new Person("Name1"));
        ListToBind.Add(new Person("Name2"));
        ListToBind.Add(new Quantity(123));
        ListToBind.Add(new Person("Name3"));
        ListToBind.Add(new Person("Name4"));
        ListToBind.Add(new Quantity(456));
        ListToBind.Add(new Person("Name5"));
        ListToBind.Add(new Quantity(789));
    }
}

【问题讨论】:

    标签: c# wpf data-binding itemtemplate


    【解决方案1】:

    您说“它声称找不到我的类型”。这是你应该解决的问题。

    问题很可能是您没有在 XAML 中创建引用 CLR 命名空间和程序集的命名空间声明。您需要在 XAML 的顶级元素中添加这样的内容:

    xmlns:foo="clr-namespace:MyNamespaceName;assembly=MyAssemblyName"
    

    一旦你这样做了,XAML 就会知道任何带有 XML 命名空间前缀 foo 的东西实际上是 MyNamespaceName 命名空间中 MyAssemblyName 中的一个类。

    然后您可以在创建 DataTemplate 的标记中引用该 XML 命名空间:

    <DataTemplate DataType="{foo:Person}">
    

    您当然可以构建一个模板选择器,但这会给您的软件添加一些不需要的东西。 WPF 应用程序中有模板选择器的位置,但不是这样。

    【讨论】:

    • +1 你是对的。我想知道为什么我从未见过这个非常酷的选项。这里是 msdn 链接:msdn.microsoft.com/en-us/library/…
    • DataTemplateSelector 一旦我把它放进去,看起来确实很笨拙。谢谢你的建议。我想一定有一个简单的方法可以解决这个问题,而且你已经提供了!
    • 对我不起作用,但 可以。错字?
    【解决方案2】:

    您必须使用DataTemplateSelector。示例见here

    关于MSDN的更多信息

    【讨论】:

    • 您不必使用模板选择器; WPF 的默认模板选择方法正是这里所需要的。
    猜你喜欢
    • 2013-03-21
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多