WPF - 基于类型的对象的模板化列表

时间:2016-03-01 01:38:12

标签: c# wpf datatemplate

我有一个列表对象(PropertyBase是具有KeyValue属性的基本类型),我希望以某种格式显示给用户。根据对象类型,我想在不同的控件之间切换。假设intdouble值与Label s一起显示,其中string值可通过TextBox进行编辑。同样,我想为ComboBox值显示enum

到目前为止,我已阅读了DataTemplate s,ContentPresenter s并提出了以下xaml代码段。但是,下面的模板显示对象的类型(PropertyBase[Int64]PropertyBase[String])而不是它的值。这有什么问题?

<ItemsControl ItemsSource="{Binding Path=Properties}">
    <ItemsControl.ItemTemplate>
        <DataTemplate DataType="models:PropertyBase">
            <Grid Margin="0,0,0,5">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Label Grid.Column="0" Content="{Binding Key}" />
                <ContentPresenter Grid.Column="1" Content="{Binding}">
                    <ContentPresenter.Resources>
                        <DataTemplate DataType="{x:Type system:Int64}">
                            <Label Content="{Binding}" />
                        </DataTemplate>
                        <DataTemplate DataType="{x:Type system:String}">
                            <TextBox Text="{Binding Value, Mode=TwoWay}" />
                        </DataTemplate>
                    </ContentPresenter.Resources>
                </ContentPresenter>
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

1 个答案:

答案 0 :(得分:0)

问题是数据绑定。 ContentPresenter没有正确绑定。 <ContentPresenter Grid.Column="1" Content="{Binding}">绑定到当前来源(ref)。当前来源是PropertyBase类,其中包含KeyValueContentPresenter试图通过调用PropertyBase方法而不是使用ToString来表示Value课程。

使用<ContentPresenter Grid.Column="1" Content="{Binding Path=Value}">解决了这个问题。