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);
我正在开始我的第一个 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);