Как добавить вид с помощью селектора datatemplate? - PullRequest
0 голосов
/ 22 января 2012

Чтобы решить эту проблему, я могу себе представить, что мне нужно использовать PRISM или селектор таблицы данных. Я не совсем уверен. Хорошо, позвольте мне объяснить мою ситуацию. У меня есть этот класс с именем BinaryProblem, и это модель.

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

BinaryProblem является универсальным классом, поэтому T может быть целым, двойным, десятичным или включающим другой, 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 является примитивным типом данных, следует рисовать только текстовый блок; но если тип данных 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>

Я не хочу создавать два вида, я думаю, возможно ли избежать создания двух видов? Я имею в виду, чтобы иметь только один вид и определить, должен ли показываться шаблон дроби или текстовый блок.

1 Ответ

3 голосов
/ 22 января 2012

Попробуйте: сначала создайте шаблоны данных для поддерживаемых типов:

    <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:

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