2012-04-02 3 views
2

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

Я попытался создать локальный ресурс с ключом, но мне нужно, чтобы установить Content = «{DynamicResource Рез}», поэтому из 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> 

Любая помощь оценена!

L.

ответ

1

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

2

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

+0

Благодарим вас за ответ. Это кажется правильным, но как я могу это сделать из ViewModel? Я получил зарегистрированное сообщение, и я знаю, когда изменяется представление (потому что это UserControl, включенное во многие представления), но проблема заключается в том, как изменить содержимое, используя привязку к свойству ... Можете ли вы опубликовать пример? – zero51