Wpf MVVM Light-将按钮内容从动态资源更改为绑定
在每个视图的应用程序中,我都有一个“共享”用户控件,每个视图都会加载该控件。这个控件只包含四个按钮,但我需要根据加载它的视图更改每个按钮的内容。 没有问题,直到内容只是一个字符串,但我不知道如何做,一旦我需要把一些控件作为一个按钮的内容,如图像和文本网格 我尝试用一个键创建一个本地资源,但我需要设置Content=“{DynamicResource res}”,因此从ViewModel中,我无法对内容进行任何绑定Wpf MVVM Light-将按钮内容从动态资源更改为绑定,wpf,mvvm,mvvm-light,Wpf,Mvvm,Mvvm Light,在每个视图的应用程序中,我都有一个“共享”用户控件,每个视图都会加载该控件。这个控件只包含四个按钮,但我需要根据加载它的视图更改每个按钮的内容。 没有问题,直到内容只是一个字符串,但我不知道如何做,一旦我需要把一些控件作为一个按钮的内容,如图像和文本网格 我尝试用一个键创建一个本地资源,但我需要设置Content=“{DynamicResource res}”,因此从ViewModel中,我无法对内容进行任何绑定 <UserControl x:Class="PlusMatic.Presen
<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.如果我理解正确,您需要为每个不同的视图使用DataTemplates,然后使用DataTrigger或相关触发器在模板之间切换。根据建议,我选择使用一个数据模板和一个触发器来实现它,它可以帮助我在两个不同的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>
通过在ViewModel的dataTrigger中简单地绑定布尔属性“UseButtoneLangChangeControlTemplate”,我可以更改数据模板
谢谢你的回答。这似乎是正确的,但如何从ViewModel执行此操作?我注册了一条消息,我知道视图何时更改(因为这是许多视图中包含的UserControl),但问题是如何通过使用属性绑定来更改内容。。。你能举个例子吗?