Как привязать триггер IsSelected элемента RadioButton к ContentTemplate (который содержит RadioButton) - PullRequest
0 голосов
/ 25 января 2012

У меня есть приложение WPF Prism 4 MVVM. ViewItemControl используется в качестве элемента управления навигацией для изменения видов с использованием Prism Regions и Views.

<Style x:Key="ViewItemControlStyle" BasedOn="{StaticResource {x:Type Button}}" TargetType="{x:Type Controls:ViewItemControl}">
    <Setter Property="MinWidth" Value="110" />
    <Setter Property="Height" Value="60" />
    <Setter Property="Background" Value="{StaticResource ButtonBackgroundBrush}" />
    <Setter Property="Margin" Value="1" />
    <Setter Property="OverridesDefaultStyle" Value="True" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Controls:ViewItemControl}">

                    <ContentPresenter x:Name="PART_Content" 
                                      VerticalAlignment="Center" HorizontalAlignment="Center"
                                      Style="{DynamicResource DefaultButtonText}" />
               <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="true">

                    </Trigger>
                    <Trigger Property="IsPressed" Value="true">

                    </Trigger>
                    <Trigger Property="IsSelected" Value="true">

                    </Trigger>
                    <Trigger Property="IsEnabled" Value="False">

                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Теперь я реализовал пользовательский элемент управления ImageButton с Normal, Hover и Selected Trigger для изменения источника изображения.

<ControlTemplate x:Key="ImageButtonTemplate" TargetType="{x:Type Controls:ImageButton}">
    <Grid x:Name="Grid">
        <Image Name="ButtonImage" 
            Source="{Binding NormalImage, RelativeSource={RelativeSource TemplatedParent}}" 
            Height="{Binding ImageSize, RelativeSource={RelativeSource TemplatedParent}}" 
            Width="{Binding ImageSize, RelativeSource={RelativeSource TemplatedParent}}"
            ToolTip="{TemplateBinding ToolTip}"/>
        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" 
                        VerticalAlignment="{TemplateBinding VerticalContentAlignment}" RecognizesAccessKey="True" />

    </Grid>

    <ControlTemplate.Triggers>
        <Trigger Property="IsMouseOver" Value="true">
            <Setter TargetName="ButtonImage" Property="Source" Value="{Binding HoverImage, RelativeSource={RelativeSource TemplatedParent}}" />
        </Trigger>
        <Trigger Property="IsChecked" Value="true">
            <Setter TargetName="ButtonImage" Property="Source" Value="{Binding SelectedImage, RelativeSource={RelativeSource TemplatedParent}}" />
        </Trigger>
        <Trigger Property="IsEnabled" Value="false">
            <Setter TargetName="ButtonImage" Property="Source" Value="{Binding DisabledImage, RelativeSource={RelativeSource TemplatedParent}}" />
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

Я хочу определить ViewItemControl, который будет использоваться в качестве навигации с элементом управления изображениями в нем. Я хочу связать Isselected Trigger обоих элементов управления, чтобы добиться как изменения источника изображения, так и изменения вида. Мне нужна помощь в преодолении этого поведения.

1 Ответ

0 голосов
/ 25 января 2012

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

Например, в приложении, над которым я работаю, у меня есть View, который должен иметь «режимы»: режим «Обзор» и режим «Детали». Мой ToggleButton имеет привязку, как:

<ToggleButton IsSelected="{Binding Path=DetailsModeSelected, Mode=TwoWay}" ... />

Когда кнопка переключения выбрана, привязка устанавливает для свойства DetailsModeSelected значение true, что в моей модели представления изменяет некоторые другие свойства, которые представление затем получает через IPropertyChangeNotification.

Пусть ваша ViewModel сделает эту работу, а конкретный элемент управления (или представление) не имеет значения.

...