ReactiveUI 将枚举 属性 绑定到视图模型中的颜色 属性

ReactiveUI Bind an Enum Property to a Color Property in View Model

我正在开始我的第一个 Reactive UI 项目。我有一个枚举,我想将特定颜色映射到特定枚举值。我如何使用 Reactive UI 完成此操作?因此,当 Status 更改时,TextColor 也会更改。

说我想映射

这是我的视图模型

public enum Status { Running, Idle, Faulted, Manual}

public class MachineStatusViewModel : ReactiveObject
{
    public string Name;
    public Status Status;
    public System.Drawing.Color TextColor;

    public MachineStatusViewModel()
    {           

    }
}

更好的方法是在 WhenAnyValue 上使用 OneWayBind 运算符

this.OneWayBind(this.ViewModel, vm => vm.Status, view => view.TextColor, GetColor);

private Color GetColor(Status status)
{
    switch (status)
    {
        case Status.Running:
            return Color.Green;
        case Status.Idle:
            return Color.Orange;
        case Status.Faulted:
            return Color.Red;
        case Status.Manual:
            return Color.Blue;
    }
}

另一种选择是使用资源字典。它可以让您用一本字典替换另一本字典或轻松定义主题资源,而无需将值硬编码为 return。您的案例的简单示例:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Color x:Key="Running.Color" G="255"/>
    <Color x:Key="Idle.Color" R="255" G="165"/>
    <Color x:Key="Faulted.Color" R="255"/>
    <Color x:Key="Manual.Color" B="255"/>
</ResourceDictionary>

然后您在视图 xaml 中将这本词典作为合并词典使用(即在 Window 中)

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/<AssemblyName>;component/<Resource-Dictionary-File>.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>

以及用法:

this.WhenAnyValue(x => x.ViewModel.Status)
    .Select(x => FindResource($"{x}.Color"))
    .BindTo(this, view => view.TextColor);