Содержание кнопки WPF на основе настроек DataContext - PullRequest
3 голосов
/ 17 января 2011

Я работаю с шаблоном WPF и MVVM, у меня есть простое представление, состоящее из кнопки, которая должна отображать одно или другое в зависимости от свойства DataContext (viewmodel), который я использовал, чтобы попытаться использовать datatggers и datatemplatesзаставить это работать, но по какой-то причине привязка не оценивается (или я делаю что-то не так).

    <Button x:Class="EpicNavalBattle.View.PositionView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 

        >
    <Button.Resources>
        <DataTemplate x:Key="Hidden">
            <Label Content="Hidden"></Label>
        </DataTemplate>
        <DataTemplate x:Key="Shown">
            <Label Content="{Binding Path=Content.ContentName}" />
        </DataTemplate>



    </Button.Resources>
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Revealed}" Value="False">
                    <Setter Property="ContentTemplate" Value="{DynamicResource Hidden}"></Setter>

                </DataTrigger>
                <DataTrigger Binding="{Binding Revealed}" Value="True">
                    <Setter Property="ContentTemplate" Value="{DynamicResource Shown}"></Setter>

                </DataTrigger>
            </Style.Triggers>
        </Style>

    </Button.Style>


</Button>

Просто, чтобы избежать путаницы: Content является свойством ViewModel (унаследованного datacontext), который в основномкласс Model, а ContentName - свойство класса Model.Весь шаблон данных оценен, потому что, чтобы доказать это, я изменил содержимое Content = "Binding ...." для текста, и он фактически показывает кнопку с указанной меткой внутри.Прямо сейчас, я вижу только кнопки без текста (маленький, минимальный размер), любая помощь приветствуется (не только о том, как решить эту проблему, но и о том, что я делаю здесь неправильно).спасибо!

1 Ответ

4 голосов
/ 17 января 2011

Я протестировал ваш пример кода, и проблема заключается в следующем:

ContentControls, например, Button, установите их содержимое как DataContext для DataTemplate.Поэтому, когда вы привязываетесь к DataContext, вы фактически привязываетесь к содержимому вашей кнопки.

Вы можете решить ее двумя способами:

{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Button}}, Path=DataContext.Content.ContentName}

Или установить значение как содержимое вВаш триггер:

<Setter Property="Content" Value="{Binding Content.ContentName}"></Setter>

Это последнее решение также будет проще с Hidden Http, поэтому вы можете выбросить эти шаблоны:

            <Button.Style>
                <Style TargetType="{x:Type Button}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Revealed}" Value="True">
                                <Setter Property="Content" Value="{Binding Content.ContentName}"></Setter>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding Revealed}" Value="False">
                                <Setter Property="Content" Value="Hidden"></Setter>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Button.Style>

Дополнительный бонус: ультра короткийрешение:

<Style TargetType="{x:Type Button}">
    <Setter Property="Content" Value="Hidden" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding Revealed}" Value="True">
            <Setter Property="Content" Value="{Binding Content.ContentName}" />
        </DataTrigger>
    </Style.Triggers>
</Style>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...