我有一个MainView - 它有一个属性“ViewModel” - 当我将此ViewModel更改为不同类型时,我将窗口上的datacontext更新为特定的viewmodel,然后我使用ContentControl和DataTemplate来更改一些内容 - 这一切都有效。基于视图模型类型的边界触发器不起作用
现在,我尝试创建一个触发器来改变边界的基础上,视图模型类型的背景 - 我想出了这一点:
<Border Background="#3f3f3f" CornerRadius="10">
<Border.Style>
<Style TargetType="Border">
<Style.Triggers>
<DataTrigger Binding="{Binding}" Value="{x:Type viewmodels:AllBeadsViewModel}">
<Setter Property="Background" Value="White"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<StackPanel Orientation="Vertical" VerticalAlignment="Center" Margin="10">
<Image Height="32" Source="/Images/Icons/bookmark-1.png" Margin="0,0,0,5" />
<TextBlock Text="All Beads" VerticalAlignment="Center" Foreground="White" />
</StackPanel>
</Border>
我使用WPF督察,试图确保该datacontext是正确的(AllBeadsViewModel),并且setter被正确描述 - 所有似乎都匹配。我在这里做错了什么?
如果没有一个好的[mcve]清楚地表明你正在尝试做什么,哪些不起作用,以及你想要什么,而不能确切知道一个好的答案是什么。但是,在您发布的代码中,您似乎将对象本身与'System.Type'的实例进行比较。除非你的对象是'Type',否则永远不会成功。也许你想为绑定写一个转换器,它在对象上调用'GetType()'(即将对象转换为它的类型)。那么比较就会有意义。 –
@PeterDuniho谢谢你的回复。真的很难知道要在这个问题中输入多少信息。我可以链接我的整个源代码 - 但这只会造成太多的噪音。 所以我的Window.DataContext是一个类,AllBeadsViewModel或EditBeadViewModel - 基于它是哪一个,我想要一个边框切换背景色。所以是的,我正在检查类型。我明白你的观点。所以我做了一个转换器。首先我尝试了匹配值。GetType(){x:Type viewmodels:AllBeadsViewModel} - 那没有用 - 所以我尝试了匹配value.GetType()。Name到“AllBeadsViewModel” - 仍然没有效果 –
还要记住,元素将覆盖任何尝试将其设置为样式。除了转换器之外,你还应该从'Border'元素声明中去掉'Background =“#3f3f3f”',并在样式中加入' '。 –