2009-11-25 149 views
9

我有一个包含图像的数据模板,如果ViewModel中的属性值为true,我想隐藏该图像。任何人都可以告诉我为什么下面的xaml不起作用?WPF触发器绑定到MVVM属性

<Image x:Name="img" Source="..\Images\List_16.png" Margin="0,0,5,0"> 
    <Image.Style> 
    <Style> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding CurrentListHasPendingChanges}" Value="True"> 
      <Setter Property="Image.Visibility" Value="Hidden" /> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding CurrentListHasPendingChanges}" Value="False"> 
      <Setter Property="Image.Visibility" Value="Visible" /> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    </Image.Style> 
</Image> 

回答

3

不是

<Setter Property="Visibility" Value="Hidden" /> 

我假设你使用INotifyProptyChanged。

编辑我做了一些谷歌搜索,我想你需要使用某种模板才能使触发器工作。

例如:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/ae2dbfb7-5dd6-4352-bfa1-53634289329d

http://www.thejoyofcode.com/Help_Why_cant_I_use_DataTriggers_with_controls_in_WPF.aspx

+0

是的我实现INotifyPropertyChanged。 当我按照上述方式更改设置器时,出现以下编译错误: 无法解析样式属性“可见性”。验证拥有的类型是Style的TargetType,还是使用Class.Property语法来指定属性 – 2009-11-25 13:53:22

+0

感谢这些,我会尽快通过它们 – 2009-11-25 15:34:24

6

尝试从属性= “Image.Visibility” 删除 “图像” 的一部分,所以你必须:

<Setter Property="Visibility" Value="Hidden"/> 

,并添加TargetType的你的风格:

<Style TargetType="{x:Type Image}"> 
4

我刚刚做了一些simi使用ContentControl。

<ContentControl Content="{Binding CurrentListHasPendingChanges}"> 
    <ContentControl.ContentTemplate> 
    <DataTemplate> 
     <Image x:Name="img" Source="..\Images\List_16.png" Margin="0,0,5,0" Visibility="Hidden" /> 
     <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding}" Value="False"> 
      <Setter Property="Image.Visibility" Value="Visible" /> 
     </DataTrigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 
    </ContentControl.ContentTemplate> 
</ContentControl> 

http://karlhulme.wordpress.com/2007/03/06/using-a-contentcontrol-and-datatemplate-to-indicate-new-andor-modified-data/

2

在我看来,我们并不需要使用触发器,只有它工作得很好的结合。 作出有约束力的属性模型,你可以使用BooleanToVisibilityConverter 声明如下:

<UserControl.Resources> 
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/> 
</UserControl.Resources> 

以及如何使用它很简单,只是点到上述的关键:

<Image HorizontalAlignment="Left" Height="16" VerticalAlignment="Center" Width="16" 
     Visibility="{Binding HasError, Converter={StaticResource BooleanToVisibilityConverter}}" 
     Source="/myPath;component/Resources/Images/image1.png"/> 

的属性在ViewModel中:

private bool _hasError = false; 
    public bool HasError 
    { 
     get { return !string.IsNullOrEmpty(_messageError); } 
     set 
     { 
      _hasError = value;     
      this.NotifyOfPropertyChange(() => this.HasError); 
     } 
    }