如果ViewModel中属性的值为true,我有一个包含要隐藏的图像的datatemplate。谁能告诉我为什么下面的xaml不起作用?
<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>
答案 0 :(得分:6)
尝试从Property =“Image.Visibility”中删除“Image”部分,以便您拥有:
<Setter Property="Visibility" Value="Hidden"/>
并将TargetType添加到您的Style:
<Style TargetType="{x:Type Image}">
答案 1 :(得分:4)
我只是使用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>
答案 2 :(得分: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
答案 3 :(得分:2)
在我看来,我们不需要使用触发器,只有Binding才能正常工作。 要绑定到属性模型,可以使用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);
}
}