0

次の問題があります

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 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 などで型をチェックできるものはありますか? この問題をどのように解決しますか?

編集:1つのフィールドだけでなくDataTemplateを劇的に変更したい場合はどうなりますか? 上記の回避策は役に立ちません。この問題の回避策は、異なる DataTemplate を使用して 2 つの ListBox を作成し、実際の項目の種類を確認するコンバーターで可視性を設定することです。しかし、多くのバインド エラーが発生し、アプリケーションを遅くする 1 つではなく 2 つのリストボックスが生成されます。

4

1 に答える 1

3

タイプごとに 2 つの DataTemplate を作成でき、WPF はすべて魔法のように機能します。

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

 <DataTemplate DataType="{x:Type namespace:ChildrenClass2}">
<TextBlock Text="{Binding Field3}"/>
</DataTemplate>
于 2013-11-04T08:23:44.307 に答える