使用触发器 WPF MVVM 更改图像

Posted

技术标签:

【中文标题】使用触发器 WPF MVVM 更改图像【英文标题】:Change image using trigger WPF MVVM 【发布时间】:2010-12-19 16:17:21 【问题描述】:

这可能很简单,但我似乎无法让它发挥作用。我有一个视图模型,它公开了一个名为 bool NotFound 的属性,我想将它绑定到触发器,以便当它更改我的控件上的图像时。

这是我用作我的一个视图模型的数据模板的 xaml。

<DataTemplate DataType="x:Type local:TabFileViewModel">
        <StackPanel Orientation="Horizontal">
              <Image Width="16" Height="16" Margin="3,0" Source="Image\TabFile.PNG" />
              <TextBlock Text="Binding Name" ToolTip="Binding FullPath"/>
       </StackPanel>
</DataTemplate>

我希望能够将 绑定到 NotFound 属性并更改图像源。

【问题讨论】:

【参考方案1】:

一切都很好,我想通了。

<DataTemplate DataType="x:Type local:TabFileViewModel">
       <StackPanel Orientation="Horizontal">
         <Image Width="16" Height="16" Margin="3,0">
             <Image.Style>
                 <Style TargetType="x:Type Image">
                 <Style.Triggers>
                      <DataTrigger Binding="Binding NotFound" Value="false">
                          <Setter Property="Source" Value="Image\TabFile.PNG"/>
                      </DataTrigger>
                      <DataTrigger Binding="Binding NotFound" Value="true">
                          <Setter Property="Source" Value="Image\ErrorTabFile.PNG"/>
                      </DataTrigger>
                   </Style.Triggers>
              </Style>
           </Image.Style>
     </Image>
</DataTemplate> 

【讨论】:

有什么方法可以使用 DataContext 而不是 DataTemplate?未定义 DataTemplate 时,此代码不起作用。【参考方案2】:
<DataTemplate DataType="x:Type local:TabFileViewModel">
        <StackPanel Orientation="Horizontal">
              <Grid>
                  <Image x:Name="a" Width="16" Height="16" Margin="3,0" Source="Image\NotFounds.PNG" />
                  <Image x:Name="b" Width="16" Height="16" Margin="3,0" Source="Image\TabFile.PNG" />
                </Grid>
              <TextBlock Text="Binding Name" ToolTip="Binding FullPath"/>
       </StackPanel>
       <DataTemplate.Triggers>
            <DataTrigger Binding=Binding NotFound Value="true">
                  <Setter TargetName="a" TargetProperty="Visibility" Value="Visible" />
                  <Setter TargetName="b" TargetProperty="Visibility" Value="Hidden" />
            </DataTrigger>
            <DataTrigger Binding=Binding NotFound Value="false">
                  <Setter TargetName="a" TargetProperty="Visibility" Value="Hidden" />
                  <Setter TargetName="b" TargetProperty="Visibility" Value="Visible" />
            </DataTrigger>
       </DataTemplate.Triggers>
</DataTemplate>

【讨论】:

我相信 Visibility 最好是折叠而不是隐藏。两者都可以在这种方法中工作,但会发生一些额外的测量。

以上是关于使用触发器 WPF MVVM 更改图像的主要内容,如果未能解决你的问题,请参考以下文章

WPF MVVM Binding x:Name 不触发方法

WPF RadBusyIndi cator使用MVVM命令模式不触发

WPF MVVM 从 ViewModel 触发事件的正确方法

Wpf数据网格CurrentCell属性只触发一次MVVM

2019-11-29-WPF-绑定命令在-MVVM-的-CanExecute-和-Execute-在按钮点击都没触发可能的原因...

WPF - 如何使用模板创建图像按钮