WPF使用MultiBinding绑定双值到同一属性解决表格选中行样式丢失问题
1. 替换原有单值转换器为多值转换器
将原来实现IValueConverter的转换器改为实现IMultiValueConverter,可以同时接收两个绑定值做逻辑判断:
using System; using System.Globalization; using System.Windows; using System.Windows.Data; using System.Windows.Media; public class BookMarkMultiConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { // 绑定顺序:第一个是数据源的isBookMarked,第二个是GridCell的IsSelected属性 if (values == null || values.Length < 2) return Brushes.White; // 优先判断选中状态,保留默认选中样式 if (values[1] is bool isSelected && isSelected) { // 直接返回系统默认选中高亮色,也可以根据需求自定义选中+标记的组合色 return SystemColors.HighlightBrush; } // 未选中状态下判断书签标记 if (values[0] is bool isBookMarked && isBookMarked) { return Brushes.Yellow; } return Brushes.White; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }
2. 声明转换器资源
在你的窗口/页面/全局资源字典中添加转换器实例声明,注意替换local为你转换器所在的命名空间:
<Window.Resources> <local:BookMarkMultiConverter x:Key="BookMarkMultiConverter"/> <!-- 其他原有资源 --> </Window.Resources>
3. 修改GridCell样式的Background绑定为MultiBinding
替换原来的单值绑定为多值绑定,同时绑定数据源的isBookMarked和控件自身的IsSelected属性:
<Style TargetType="syncfusion:GridCell" x:Key="ComCell"> <Setter Property="Foreground" Value="{Binding COMPort , Converter={StaticResource CVconverters } }" /> <!-- 替换原Background的单绑定为以下多绑定 --> <Setter Property="Background"> <Setter.Value> <MultiBinding Converter="{StaticResource BookMarkMultiConverter}"> <Binding Path="isBookMarked"/> <Binding Path="IsSelected" RelativeSource="{RelativeSource Self}"/> </MultiBinding> </Setter.Value> </Setter> </Style>
逻辑说明
- 优先级为:行选中状态 > 书签标记状态,选中时优先展示系统默认选中样式,不会被书签背景覆盖
- 如果需要选中时也保留书签标记效果,可以修改转换器逻辑,比如选中且有标记时返回橙黄色,自行调整返回的Brush即可。
内容的提问来源于stack exchange,提问作者ברק רוזנפלד
相关产品推荐
相关产品推荐

