WPF中如何设置DataTrigger的Value绑定DataTemplate当前项实例
解决方案
你当前的写法存在两个核心问题:
DataTrigger的Value属性不是依赖属性,不支持动态绑定,无法直接指向当前列表项的实例- 代码中错误地将
<Grid.Triggers>嵌套在<Style.Triggers>内部,属于无效语法
你可以通过多值转换器实现实例相等判断的方案实现需求,完全不需要修改业务对象,具体步骤如下:
步骤1:实现相等判断转换器
public class ObjectEqualityConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return values.Length >= 2 && Equals(values[0], values[1]); } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } }
步骤2:注册转换器到XAML资源
在你的页面/窗口资源中添加转换器声明:
<Window.Resources> <local:ObjectEqualityConverter x:Key="ObjectEqualityConverter" /> </Window.Resources>
注意将local替换为你定义转换器的命名空间前缀。
步骤3:修改Grid的触发器逻辑
将你原来的HiddenGrid的Style替换为以下代码即可:
<Grid x:Name="HiddenGrid" Background="Red" Visibility="Hidden" > <Grid.Style> <Style TargetType="Grid"> <Style.Triggers> <DataTrigger Value="True"> <DataTrigger.Binding> <MultiBinding Converter="{StaticResource ObjectEqualityConverter}"> <!-- 绑定当前列表项实例 --> <Binding /> <!-- 绑定ListView的附加属性值 --> <Binding Path="(dependencyObjects:InterestingItem.Interesting)" RelativeSource="{RelativeSource AncestorType={x:Type ListView}}" /> </MultiBinding> </DataTrigger.Binding> <Setter Property="Visibility" Value="Visible" /> </DataTrigger> </Style.Triggers> </Style> </Grid.Style> </Grid>
该方案的逻辑是通过多值转换器同时拿到当前列表项实例和ListView的InterestingItem值,判断两者为同一实例时返回True,触发触发器将Grid改为可见状态,完全由控件层控制逻辑,不涉及业务对象修改。
内容的提问来源于stack exchange,提问作者DefenestrationDay
相关产品推荐
相关产品推荐

