我正在使用WPF和MVVM模式,我有一个简单的视图,它包含一个Button,它应该显示一个或另一个东西,具体取决于DataContext的属性(viewmodel) 我已经使用datatriggers和datatemplates来尝试使这个工作,但由于某种原因,绑定没有评估(或我做错了)。
<Button x:Class="EpicNavalBattle.View.PositionView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
<Button.Resources>
<DataTemplate x:Key="Hidden">
<Label Content="Hidden"></Label>
</DataTemplate>
<DataTemplate x:Key="Shown">
<Label Content="{Binding Path=Content.ContentName}" />
</DataTemplate>
</Button.Resources>
<Button.Style>
<Style TargetType="{x:Type Button}">
<Style.Triggers>
<DataTrigger Binding="{Binding Revealed}" Value="False">
<Setter Property="ContentTemplate" Value="{DynamicResource Hidden}"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Revealed}" Value="True">
<Setter Property="ContentTemplate" Value="{DynamicResource Shown}"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
为了避免混淆:Content是ViewModel(继承的datacontext)的一个属性,它基本上是Model类,而ContentName是Model类的一个属性。 对整个数据窗口进行了评估,因为为了证明这一点,我更改了文本的Content =“Binding ....”内容,它实际上显示了一个内部带有指定标签的按钮。 现在,我看到的只是没有文字的按钮(小,最小尺寸) 任何帮助表示赞赏(不仅是如何解决这个问题,还有我在这里做错了什么)。谢谢!
答案 0 :(得分:4)
我测试了您的代码示例,问题是:
ContentControls
例如Button,将其内容设置为DataContext
的{{1}}。因此,当您绑定到DataTemplate
时,实际上是绑定到Button的内容。
您可以通过两种方式解决它:
DataContext
或者将值设置为触发器中的内容:
{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Button}}, Path=DataContext.Content.ContentName}
使用隐藏的btw,最后一个解决方案也会更容易,所以你可以扔掉这些模板:
<Setter Property="Content" Value="{Binding Content.ContentName}"></Setter>
额外奖励:超短解决方案:
<Button.Style>
<Style TargetType="{x:Type Button}">
<Style.Triggers>
<DataTrigger Binding="{Binding Revealed}" Value="True">
<Setter Property="Content" Value="{Binding Content.ContentName}"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Revealed}" Value="False">
<Setter Property="Content" Value="Hidden"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>