gpt4 book ai didi

c# - 基于 View 模型类型的边框触发器不起作用

转载 作者:行者123 更新时间:2023-12-03 10:42:53 25 4
gpt4 key购买 nike

我有一个 MainView - 它有一个属性“ViewModel” - 当我将此 ViewModel 更改为不同的类型时,我将窗口上的 datacontext 设置为特定的 viewmodel,然后我使用 ContentControl 和 DataTemplate 来更改一些内容 - 这个一切正常。

现在我尝试创建一个触发器来根据 View 模型类型更改边框的背景 - 我想出了这个:

<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 Inspector 尝试确保 datacontext 正确(AllBeadsViewModel)并且 setter 的描述正确 - 一切似乎都匹配。我在这里做错了什么?

最佳答案

您发布的 XAML 中有两个问题。

第一个是直接的问题,如何根据对象的类型设置触发器。您的 <DataTrigger/>元素正在引用 Binding 中的当前数据上下文属性,然后在 Value 中引用对象的类型属性(property)。因此,这是要求 WPF 将数据上下文对象本身与 System.Type 的实例进行比较。 .由于您的数据上下文对象实际上不是一种类型,因此永远不会触发。

要解决这个问题,您需要一种机制来比较当前数据上下文对象的类型和 AllBeadsViewModel。类型。与 WPF 的典型情况一样,有几个不同的选项。但恕我直言,最简单的方法之一是写一个 IValueConverter对于触发器的绑定(bind),它只返回 GetType() 的结果上界值。

现在,您发布的 XAML 仍然不会根据触发器更新边框的背景颜色,因为 Background 的显式设置<Border/> 中的属性(property)元素 takes precedence over any setter found in a style .要解决此问题,您需要删除显式属性值分配,并将其替换为 <Setter/>样式本身的元素:

<Border CornerRadius="10">
<Border.Style>
<p:Style TargetType="Border">
<Setter Property="Background" Value="#3f3f3f"/>
<!-- etc. -->
</p:Style>
</Border.Style>
<!-- etc. -->
</Border>

(您可以忽略我添加到上面的 p: 元素中的 <Style/> XML 命名空间……因为 XML/XAML 的 Stack Overflow 代码格式化程序被不合格的 <Style/> 元素混淆并停止格式化为 XML,直到元素是封闭的。)

另见 WPF Trigger won't set property if set in Element讨论 XAML 的第二个方面/问题。

关于c# - 基于 View 模型类型的边框触发器不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46995351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com