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

C# 如何在视图模型不知道WPF的情况下绑定WPF元素颜色?,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我想知道如何将元素的颜色属性绑定到ViewModel,而不将视图实现(例如WPF)泄漏到ViewModel中,从而创建依赖关系。例如,我有一个TextBlock,我将其前台属性绑定如下: <TextBlock Name="MyTextBlock" Foreground="{Binding Path=PropName}" /> public System.Windows.Media.Brush PropName { get { //assume pre

我想知道如何将元素的颜色属性绑定到ViewModel,而不将视图实现(例如WPF)泄漏到ViewModel中,从而创建依赖关系。例如,我有一个
TextBlock
,我将其
前台
属性绑定如下:

<TextBlock Name="MyTextBlock" Foreground="{Binding Path=PropName}" />
public System.Windows.Media.Brush PropName
{
    get
    {
        //assume presentation logic to determine correct color.
        return System.Windows.Media.Brushes.Red;
    }
}
 <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>

我不希望我的ViewModel绑定到WPF(即通过
System.Windows.Media.Brush
)或任何其他演示框架。是否有某种方法可以使用通用或通用颜色类型,甚至RGB值,并在绑定的XAML中正确解释它?

如果不想引用这些名称空间,可以返回字符串并使用包含以下内容的转换器:

var color = (Color)ColorConverter.ConvertFromString("Red");
或RGB

var color = (SolidColorBrush)(new BrushConverter().ConvertFrom("#ffaacc"));

不过,我可能不太理解这个问题。

我会创建一个颜色枚举。 e、 g:

然后,如果您正在使用WPF进行开发,您可以只创建一个ValueConverter,在这里您可以确定枚举是否为红色,您可以按照您希望的方式对其进行转换并将其返回以供控制。这样,就可以将UI逻辑与viewmodel分离。Viewmodel告诉您什么颜色和UI处理其余部分


如果你想要自定义颜色,上面的答案是一个很好的处理方法。

这是我最喜欢的新作品(很抱歉VB):

使用方法如下:

<TextBlock Name="MyTextBlock" Foreground="{Binding Path=PropName}" />
public System.Windows.Media.Brush PropName
{
    get
    {
        //assume presentation logic to determine correct color.
        return System.Windows.Media.Brushes.Red;
    }
}
 <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等)映射到您想要的任何对象。

只需像这样将带有十六进制的字符串绑定到元素的后台属性(当然,您需要一个Notify实现)

XAML


为了确保我正确地理解您,这只是一种过于复杂的方式,询问如何将画笔/颜色作为视图的资源,而不使用代码隐藏和xaml吗?不,我对WPF真的很陌生。你能详细说明一下吗?1)你不知道。2) 它们很便宜,这很好。这不是教条,而是模式。旁注——为什么您的虚拟机知道或关心颜色?老实说,这不应该。但是,系统的某些部分可能由特定的颜色表示,具体取决于它当前所处的状态。使用转换器解释虚拟机或模型的状态,并将该状态转换为颜色。例如,如果您的人物模型无效,请将其转换为红色。如果它有效、已修改但未保存,请将其转换为黄色。您只需从视图模型返回字符串即可。隐式TypeConverter将其转换为画笔。您需要返回已知颜色“红色”或返回有效的#FFFFF颜色。请映射某人的答案或向我们提供更多信息。我假设您的代码示例将包含在代码后面。您将如何在XAML中实现这一点呢?没有代码就无法实现AFAIK。但不需要代码隐藏。只需要一个独立的、可重用的转换器类。这是非常好的mvvm。
public string anycolor { get; set; }