如何在视图模型不知道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中正确解释它?

如何在视图模型不知道WPF的情况下绑定WPF元素的颜色

我将创建一个颜色枚举。例句:

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等)映射到您想要的任何对象。