如何使用datatemplate选择器注入视图

本文关键字:注入 视图 选择器 datatemplate 何使用 | 更新日期: 2023-09-27 18:21:06

要解决这个问题,我可以想象我需要使用PRISM或数据模板选择器。我真的不确定。好吧,让我解释一下我的情况。我有一个名为BinaryProblem的类,它是模型。

public class BinaryProblem<T> {
    public T Number1 { get; set; }
    public T Number2 { get; set; }
}

BinaryProblem是一个泛型类,因此T可以是int、double、decimal或包含另一个Fraction

public class Fraction {
    public int Numerator {get;set;}
    public int Denominator {get;set;}
}

重点是为原始数据类型创建一个视图,为分数创建另一个视图。这是观点:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
    <..Something.. Text="{Binding Number1}" Grid.Column="0" />
    <TextBlock Grid.Column="1" Text="+" />
    <..Something.. Text="{Binding Number2}"  Grid.Column="2" />
</Grid>

哪里说<..Something..>,我不知道该怎么办。想法是,如果T是一个原始数据类型,那么应该只画一个文本块;但是if是Fraction数据类型应该显示下一个模板或类似的东西:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <TextBlock Grid.Row="0" Text="{Binding Numerator}" />
    <Rectangle Grid.Row="1" Fill="Black" Height="5" />
    <TextBlock Grid.Row="2" Text="{Binding Denominator}" />
</Grid>

我不想创建两个视图,我想有可能避免创建两个观点吗?我的意思是,只有一个视图并检测是否必须显示分数模板或文本块。

如何使用datatemplate选择器注入视图

试试这个:首先为支持的类型创建数据模板:

    <DataTemplate DataType="{x:Type local:Fraction}" >
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <TextBlock Grid.Row="0" Text="{Binding Numerator}" />
            <Rectangle Grid.Row="1" Fill="Black" Height="5" />
            <TextBlock Grid.Row="2" Text="{Binding Denominator}" />
        </Grid>
    </DataTemplate>
    <DataTemplate xmlns:sys="clr-namespace:System;assembly=mscorlib" 
                  DataType="{x:Type sys:Int32}" >
        <TextBlock Background="Green" Text="{Binding}" />
    </DataTemplate>

然后用ContentPresenter替换"Something"部分:

<ContentPresenter Grid.Column="0" Content="{Binding Number1}">