如何只在布局的一部分使用WPF DataTemplate?

问题描述 投票:0回答:1

在MVVM环境中,我正在使用一个列表框,在这个列表框中,我以不同的方式可视化不同的数据类型,但有一些共同的风格元素。一个最小的示例看起来像这样。

interface IPropertyItem
{
    string Description { get; }
}

class PropertyBoolItem : IPropertyItem
{
    public string Description { get; }
    public bool Value { get; set; }
}

class PropertyStringItem : IPropertyItem
{
    public string Description { get; }
    public string DifferentValue { get; set; }
}
<ListBox>
    <ListBox.Resources>
        <!-- A bool item -->
        <DataTemplate DataType="{x:Type types:PropertyBoolItem}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="10"/>
                    <ColumnDefinition Width="130"/>
                    <ColumnDefinition Width="10"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>

                <TextBlock Text{Binding Description}/>
                <CheckBox Grid.Column="3" IsChecked="{Binding Value}"/>
            </Grid>
        </DataTemplate>

        <!-- A string item -->
        <DataTemplate DataType="{x:Type types:PropertyStringItem}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="10"/>
                    <ColumnDefinition Width="130"/>
                    <ColumnDefinition Width="10"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>

                <TextBlock Text{Binding Description}/>
                <TextBox Grid.Column="3" Text="{Binding DifferentValue, Mode=TwoWay}"/>
            </Grid>
        </DataTemplate>

        <!-- and so on... -->
    </ListBox.Resources>
</ListBox>

到目前为止,一切都很正常。但我想知道是否有一个 更优雅 如何实现这一点,因为大部分的标记总是相同的,只有一些部分(如复选框或文本框)是依赖于数据类型。

先谢谢你

c# wpf xaml mvvm datatemplate
1个回答
1
投票

不知道这是否符合 "更优雅 "的要求,但它的XAML较少,而且你也不必为复杂的ListBoxItem Template而烦恼。

<ListBox ...>
    <ListBox.Resources>
        <!-- A bool item -->
        <DataTemplate DataType="{x:Type types:PropertyBoolItem}">
            <CheckBox IsChecked="{Binding Value}"/>
        </DataTemplate>
        <!-- A string item -->
        <DataTemplate DataType="{x:Type types:PropertyStringItem}">
            <TextBox Text="{Binding DifferentValue}"/>
        </DataTemplate>
    </ListBox.Resources>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="10"/>
                    <ColumnDefinition Width="130"/>
                    <ColumnDefinition Width="10"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <TextBlock Text="{Binding Description}"/>
                <ContentPresenter Grid.Column="3" Content="{Binding}"/>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
© www.soinside.com 2019 - 2024. All rights reserved.