MVVM Light - изменить содержимое кнопки содержимого динамического ресурса на привязку - PullRequest
2 голосов
/ 02 апреля 2012

В моем приложении в каждом представлении есть «общий» пользовательский элемент управления, который загружает каждое представление. этот элемент управления содержит всего четыре кнопки, но мне нужно изменить содержимое каждой кнопки в зависимости от вида, который ее загружает. Нет проблем, пока содержимое не является просто строкой, но я не знаю, как это сделать, если мне нужно добавить в качестве содержимого кнопки некоторые элементы управления, например сетку с изображениями и текстом.

Я попытался создать локальный ресурс с ключом, но мне нужно установить Content = "{DynamicResource res}", поэтому из ViewModel я не могу иметь никакой привязки к содержимому ...

<UserControl x:Class="PlusMatic.Presentation.Views.SubViews.FrontendButtonsView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" 
         d:DesignHeight="432" d:DesignWidth="211.2"
         DataContext="{Binding FrontendButtons, Source={StaticResource Locator}}" >

<Grid x:Name="LayoutRoot" Margin="0,0,0,5">
    <Grid.Resources>
        <Border x:Key="ButtonOneStructure">

                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>
                    <Image Grid.Column="0" Source="{Binding FlagPath}" Stretch="Uniform"  Margin="5"/>
                <Viewbox Stretch="Uniform" Grid.Column="1" >
                    <TextBlock TextWrapping="Wrap" Style="{DynamicResource BigTextBlockPlusMatic}" >
                                        <TextBlock.Inlines>
                                            <Run Text="{DynamicResource 103ita}" />
                                            <LineBreak />
                                            <Run Text="{DynamicResource 103eng}" />
                                            <LineBreak />
                                            <Run Text="{DynamicResource 103fra}" />
                                            <LineBreak />
                                            <Run Text="{DynamicResource 103deu}" />
                                            <LineBreak />
                                            <Run Text="{DynamicResource 103esp}" />
                                        </TextBlock.Inlines>
                    </TextBlock>
                </Viewbox>
            </Grid>

        </Border>
    </Grid.Resources>
    <Grid.RowDefinitions>
        <RowDefinition Height="0.25*"/>
        <RowDefinition Height="0.25*"/>
        <RowDefinition Height="0.25*"/>
        <RowDefinition Height="0.25*"/>
    </Grid.RowDefinitions>
    <Button x:Name="ButtonOne" Margin="0,5,10,5" Content="{DynamicResource ButtonOneStructure}" Grid.Row="0" Style="{DynamicResource FrontendButtonStyle}" />
    <Button x:Name="ButtonTwo" Margin="0,5,10,5" Content="{Binding ButtonTwoContent}" Grid.Row="1" Style="{DynamicResource FrontendButtonStyle}" />
    <Button x:Name="ButtonThree" Margin="0,5,10,5" Content="{Binding ButtonThreeContent}" Grid.Row="2" Style="{DynamicResource FrontendButtonStyle}" />
    <Button x:Name="ButtonFour" Margin="0,5,10,5" Content="{Binding ButtonFourContent}" Grid.Row="3" Style="{DynamicResource FrontendButtonStyle}" />
</Grid>

Любая помощь приветствуется!

Л. * * +1010

Ответы [ 2 ]

2 голосов
/ 03 апреля 2012

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

1 голос
/ 11 апреля 2012

Следуя предложению, я решил реализовать его с одним шаблоном данных и триггером внутри, который помогает мне переключаться между двумя различными controlTemplate:

<UserControl x:Class="PlusMatic.Presentation.Views.FrontendButtonsView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" 
         d:DesignHeight="432" d:DesignWidth="211.2"
         DataContext="{Binding FrontendButtons, Source={StaticResource Locator}}" >

<Grid x:Name="LayoutRoot" Margin="0,0,0,5">
    <Grid.Resources>

        <!--Template per i bottoni frontend-->
        <!--Bottone uno-->
        <ControlTemplate x:Key="ButtonOneLangChangeControlTemplate" TargetType="{x:Type Control}">
            <Border>
                <Grid >
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                    <Image Grid.Column="0" Source="{Binding Source={StaticResource Locator}, Path=FrontendButtons.ButtonOneFlagPath}" Stretch="Uniform" Margin="5" />
                    <Viewbox Stretch="Uniform" Grid.Column="1">
                        <TextBlock TextWrapping="Wrap" Style="{DynamicResource BigTextBlockPlusMatic}">
                            <TextBlock.Inlines>
                                <Run Text="{DynamicResource 103ita}" />
                                <LineBreak />
                                <Run Text="{DynamicResource 103eng}" />
                                <LineBreak />
                                <Run Text="{DynamicResource 103fra}" />
                                <LineBreak />
                                <Run Text="{DynamicResource 103deu}" />
                                <LineBreak />
                                <Run Text="{DynamicResource 103esp}" />
                            </TextBlock.Inlines>
                        </TextBlock>
                    </Viewbox>
                </Grid>
            </Border>
        </ControlTemplate>

        <ControlTemplate x:Key="ButtonOnePictureAndTextControlTemplate" TargetType="{x:Type Control}">
            <Border>
                <Grid >
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                    <Image Grid.Column="0" Source="{Binding Source={StaticResource Locator}, Path=FrontendButtons.ButtonOnePicturePath}" Stretch="Uniform" Margin="5" />
                    <Viewbox Stretch="Uniform" Grid.Column="1">
                        <TextBlock TextWrapping="Wrap" Style="{DynamicResource BigTextBlockPlusMatic}">
                            <TextBlock.Inlines>
                                <Run Text="{Binding Source={StaticResource Locator}, Path=FrontendButtons.ButtonOneTextToShow}" />
                            </TextBlock.Inlines>
                        </TextBlock>
                    </Viewbox>
                </Grid>
            </Border>
        </ControlTemplate>

        <DataTemplate x:Key="ButtonOneDataTemplate">
            <Control x:Name="theControl" Template="{DynamicResource ButtonOneLangChangeControlTemplate}" />
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding Path=UseButtonOneLangChangeControlTemplate}" Value="true">
                    <Setter TargetName="theControl" Property="Template" Value="{DynamicResource ButtonOneLangChangeControlTemplate}" />
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=UseButtonOneLangChangeControlTemplate}" Value="false">
                    <Setter TargetName="theControl" Property="Template" Value="{DynamicResource ButtonOnePictureAndTextControlTemplate}" />
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>

    </Grid.Resources>
    <Grid.RowDefinitions>
        <RowDefinition Height="0.25*"/>
        <RowDefinition Height="0.25*"/>
        <RowDefinition Height="0.25*"/>
        <RowDefinition Height="0.25*"/>
    </Grid.RowDefinitions>
    <Button x:Name="ButtonOne" Margin="0,5,10,5" ContentTemplate="{StaticResource ButtonOneDataTemplate}" Grid.Row="0" Style="{DynamicResource FrontendButtonStyle}" />
</Grid>

Просто связав логическое свойство "UseButtonOneLangChangeControlTemplate" в dataTrigger из ViewModel, я могу изменить время выполнения шаблона данных.

L

...