如何在视图模型不知道WPF的情况下绑定WPF元素的颜色
本文关键字:WPF 情况下 元素 颜色 绑定 不知道 视图 模型 | 更新日期: 2023-09-27 17:52:50
我想知道如何将元素的颜色属性绑定到ViewModel而不泄漏视图实现(例如WPF)到ViewModel中,从而创建依赖关系。例如,我有一个TextBlock
,我像这样绑定了它的Foreground
属性:
<TextBlock Name="MyTextBlock" Foreground="{Binding Path=PropName}" />
许多像这样,这样,这样等源使用System.Windows.Media.Brush
从ViewModel,像这样:
public System.Windows.Media.Brush PropName
{
get
{
//assume presentation logic to determine correct color.
return System.Windows.Media.Brushes.Red;
}
}
我不希望我的ViewModel绑定到WPF(即通过System.Windows.Media.Brush
)或任何其他表示框架。是否有一些方法可以这样做,以便我可以使用通用或通用颜色类型,甚至RGB值,并在绑定的XAML中正确解释它?
我将创建一个颜色枚举。例句:
enum Colors {Red, Green, Yellow, Pink, Blue};
然后,如果你正在使用WPF开发,你可以创建一个ValueConverter,在那里你可以确定枚举是否为红色,你可以按照你想要的方式转换它并返回它以进行控制。这样就可以将UI逻辑与视图模型分开。视图模型告诉什么颜色和UI处理其余的。
如果你想要自定义颜色,上面的答案是处理它的好方法
就像这样将字符串与元素的十六进制背景属性绑定(当然你需要一个Notify实现)
XAML
<Border Background="{Binding anycolor}" />
代码public string anycolor { get; set; }
如果你不想引用这些名称空间也许你可以返回一个字符串并使用包含如下内容的转换器:
var color = (Color)ColorConverter.ConvertFromString("Red");
RGB或var color = (SolidColorBrush)(new BrushConverter().ConvertFrom("#ffaacc"));
我可能不太明白这个问题。
这是我最喜欢的新作品(抱歉VB):
Imports System.Windows.Data
Public Class MappingConverter
Implements IValueConverter
Public Property Mappings As New List(Of Mapping)
Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As Globalization.CultureInfo) As Object Implements IValueConverter.Convert
Return Mappings.Where(Function(m) m.Source = value.ToString).FirstOrDefault
End Function
Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As Globalization.CultureInfo) As Object Implements IValueConverter.ConvertBack
Throw New NotImplementedException
End Function
End Class
Public Class Mapping
Public Property Source As String
Public Property Target As Object
End Class
像这样使用:
<UserControl.Resources>
<wpflib:MappingConverter x:Key="SelectionHighlightConverter">
<wpflib:MappingConverter.Mappings>
<wpflib:Mapping Source="True" Target="{x:Static Brushes.CornflowerBlue}" />
<wpflib:Mapping Source="False" Target="{x:Static Brushes.White}" />
</wpflib:MappingConverter.Mappings>
</wpflib:MappingConverter>
</UserControl.Resources>
当你在布尔属性的绑定上使用该转换器时,True或False将转换为指定的颜色。它实际上可以将任何字符串可转换值(int, string, boolean等)映射到您想要的任何对象。