WPF BaseClass项目列表及其可见性

时间:2013-11-04 08:13:18

标签: c# wpf xaml listbox

我有以下问题

public abstract class ParentClass
{
 public int Field{get;set;}
}

public class ChildrenClass1 : ParentClass
{
public int Field2{get;set;}
}
public class ChildrenClass2 : ParentClass
{
public int Field3{get;set;}
}

不,我有一个ParentClass列表。

List<ParentClass> Parents = new List<ParentClass>();

我将它绑定到Listbox就像这样。

<ListBox ItemsSource = "{Binding Parents}"/>

现在,如果它是ChildrenClass1类型,我想显示Field2,如果它是ChildrenClass2,我想在ListBox ItemTemplate中显示Field3。

我头脑中的第一个解决方案就是做这样的事情:

<ListBox ItemsSource = "{Binding Parents}"/>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text = "{Binding Converter = {StaticResource Converter}}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

转换器应该检查项目的类型,如果是ChildrenClass1则返回Field2,依此类推。

但我认为这是解决方法而不是解决方案。有没有什么可以检查xaml中的类型或类似的东西?你是如何解决这个问题的?

编辑:如果我想改变DataTemplate不仅仅是一个字段,那么情况怎么样?上述解决方法将毫无用处。解决此问题的方法是使用不同的DataTemplate创建2个ListBox,并使用转换器检查实际typeof项来设置可见性。但它会产生许多绑定错误并生成2个列表框而不是一个会减慢我们应用程序的列表框。

2 个答案:

答案 0 :(得分:3)

你可以为每种类型创建两个DataTemplate,WPF可以完全发挥它的作用。

<DataTemplate DataType="{x:Type namespace:ChildrenClass1}">
<TextBlock Text="{Binding Field2}"/>
</DataTemplate>

 <DataTemplate DataType="{x:Type namespace:ChildrenClass2}">
<TextBlock Text="{Binding Field3}"/>
</DataTemplate>

答案 1 :(得分:0)

如何将您的Parents集合包装在ObjectDataProvider中并绑定到一个属性/方法,该属性/方法根据ChildrenClass的类型返回正确的值