【问题标题】:MVVM Light - change button content form Dynamic resource to bindingMVVM Light - 将按钮内容形式更改为绑定的动态资源
【发布时间】:2012-04-16 06:40:25
【问题描述】:

在我在每个视图中的应用程序中,我都有一个“共享”用户控件,每个视图都会加载该控件。这个控件只包含四个按钮,但我需要根据加载它的视图来更改每个按钮的内容。 在内容只是一个字符串之前没问题,但是一旦我需要将一些控件(例如带有图像和文本的网格)作为按钮的内容放置,我不知道该怎么做。

我尝试使用密钥创建本地资源,但我需要设置 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>

任何帮助表示赞赏!

L.

【问题讨论】:

    标签: wpf mvvm mvvm-light


    【解决方案1】:

    如果我理解正确,您需要为每个不同的视图使用 DataTemplates,然后使用 DataTrigger 或相关触发器在模板之间切换。

    【讨论】:

    • 感谢您的回答。这似乎是正确的,但我怎样才能从 ViewModel 做到这一点?我收到一条注册消息,并且我知道视图何时更改(因为这是许多视图中包含的 UserControl),但问题是如何通过使用属性绑定来更改内容...您可以发布一个示例吗?
    【解决方案2】:

    根据建议,我选择使用一个数据模板和一个触发器来实现它,这有助于我在两个不同的 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 中简单地绑定布尔属性“UseButtonOneLangChangeControlTemplate”,我可以更改运行时数据模板。

    L

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-05
      • 2011-03-10
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 2017-05-10
      相关资源
      最近更新 更多