Переключить шаблон данных на основе значения связанных данных в Silverlight / WPF - PullRequest
5 голосов
/ 09 ноября 2010

говорят, что я использую WPF или Silverlight и привязываю ContentPresenter к целочисленному свойству:

<ContentPresenter Content={Binding Score} />

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

<Path Fill="Gold" Data="..." />

<TextBlock Text="{Binding Score}" />

Как лучше всего это настроить?Это использовать Binding Converter?Или связать с другим объектом, который динамически загружает соответствующий шаблон данных xaml и делает правильный FrameworkElement в зависимости от значения Score?Или есть еще одна хитрость, которую я упускаю - возможно, ContentPresenter не тот элемент управления, который нужно использовать?

Я подумал, можно ли сделать что-то подобное, но ему не нравится вложенная привязка в значении ContentTemplate.:

<StackPanel>
    <StackPanel.Resources>
        <DataTemplate x:Key="LowScore">
            <TextBlock Text="{Binding Path=Score}" Foreground="Red" />
        </DataTemplate>
        <DataTemplate x:Key="HighScore">
            <Path Fill="Gold" Data="M 0,0 l 10,0 l 5,-10 l 5,10 l 10,0 l -7,10 l 2,10 l -10,-5 l -10,5 l 2,-10 Z" />
        </DataTemplate>

    </StackPanel.Resources>
    <ContentPresenter Content="{Binding Score}" ContentTemplate="{StaticResource ResourceKey={Binding ScoreTemplate}}">
    </ContentPresenter>
</StackPanel>

Ответы [ 2 ]

10 голосов
/ 09 ноября 2010

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

1 голос
/ 09 ноября 2010

Возможные решения:

  1. Создайте DataTemplate со StackPanel, содержащим оба типа элементов управления, и свяжите их видимость (или используйте DataTrigger) так, чтобы за один раз был виден только один. Это довольно просто и может быть хорошо, если не так много состояний или небольшие различия.

  2. Используйте DataTemplateSelector и найдите DataTemplate по ресурсу.

...