WPF转换器如何根据ViewModel布尔值返回外部XAML的DrawingBrush?
解决WPF转换器返回不同DrawingBrush的问题
首先先纠正你XAML里的一个小拼写错误:StaticResosurce应该改成StaticResource,不然运行时会找不到转换器资源哦。
接下来,要实现根据IsNice布尔值切换两个DrawingBrush,我们只需要让转换器能访问到你在单独XAML里定义的资源,然后根据值返回对应的Brush即可,具体步骤如下:
1. 确保资源文件被全局可访问
首先要把你的DrawingBrush所在的XAML文件合并到应用的资源字典中,这样转换器就能全局获取到这些资源。比如在App.xaml里添加:
<Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <!-- 替换成你的DrawingBrush所在XAML文件的路径 --> <ResourceDictionary Source="/YourProjectName;component/Resources/YourDrawingBrushes.xaml"/> </ResourceDictionary.MergedDictionaries> <!-- 注册你的转换器 --> <local:BoolToCheckboxFillColorConverter x:Key="BoolToCheckboxFillColorConverter"/> </ResourceDictionary> </Application.Resources>
2. 实现布尔转DrawingBrush的转换器
在转换器的Convert方法中,我们通过Application.Current.Resources来获取对应的DrawingBrush资源,根据IsNice的值返回不同的Brush:
using System; using System.Windows; using System.Windows.Data; using System.Windows.Media; namespace YourProjectNamespace { public class BoolToCheckboxFillColorConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { // 先判断传入的值是否是有效的布尔类型 if (value is bool isNice) { // 根据IsNice的值选择对应的资源Key string resourceKey = isNice ? "FilterIconOrange" : "FilterIconBlack"; // 从全局资源中获取DrawingBrush var brush = Application.Current.Resources[resourceKey] as DrawingBrush; // 做个兜底判断,防止资源找不到导致空引用 return brush ?? Brushes.Gray; } // 如果传入的值不是布尔类型,返回默认值 return Brushes.Gray; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { // 因为我们只需要单向绑定(从ViewModel到View),所以这里可以抛出异常或者返回Binding.DoNothing throw new NotImplementedException("ConvertBack is not required for this scenario"); } } }
3. 验证你的CheckBox绑定
修正拼写错误后的CheckBox XAML应该是这样:
<CheckBox Name="MyCheckBox" Style="{StaticResource CheckboxFilterStyle}" Fill="{Binding IsNice, Converter={StaticResource BoolToCheckboxFillColorConverter}}" />
额外说明
如果你不想把资源放到全局应用资源里,而是放在某个控件的资源字典中,那可以通过转换器的parameter参数传递控件实例,然后从控件的Resources集合中获取资源。比如:
在XAML里传递RelativeSource作为参数:
<CheckBox Name="MyCheckBox" Style="{StaticResource CheckboxFilterStyle}" Fill="{Binding IsNice, Converter={StaticResource BoolToCheckboxFillColorConverter}, ConverterParameter={RelativeSource Self}}" />
然后修改转换器的Convert方法:
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (value is bool isNice && parameter is FrameworkElement element) { string resourceKey = isNice ? "FilterIconOrange" : "FilterIconBlack"; var brush = element.Resources[resourceKey] as DrawingBrush; return brush ?? Brushes.Gray; } return Brushes.Gray; }
这样就可以从控件级别的资源中获取DrawingBrush了。
内容的提问来源于stack exchange,提问作者G.Dealmeida
相关产品推荐
相关产品推荐

