public enum Status
{
Normal,
Success,
Warning,
Error
}
现在,让我们画出一个简单的类(ViewModel),它将包含 this enum,以及 this 的所有值的列表enum,以及 的值的集合ComboBox。由于状态本身enum(我们的状态)必须在程序运行时发生变化,因此它必须调用INPC,不要忘记这一点,否则 UI 将不会接收到更改!
结果,我的代码将是这样的:
public partial class MainViewModel : ObservableObject
{
public string[] Values => [ "Value 1", "Value 2", "Value 3", "Value 4", "Value 5" ];
public Status[] Statuses => Enum.GetValues<Status>();
[ObservableProperty]
private Status _status = Status.Normal;
}
有问题吧?我们的控件失去了标准样式,但是为什么呢?重点是,我们现在基本上已经做了类似的事情comboBox1.Style = новый стиль,但“新风格”本身是空的,里面什么也没有。在需要添加到基类的情况下该怎么办?没错,如果他们允许,我们就继承,也就是我们去做новый стиль : старый стиль。在 XAML 中,您还可以继承样式;这是通过BaseOn.实际上,我们将其添加到此<Style TargetType="ComboBox">属性中,指示应从中继承的资源(名称/类型)。由于我们需要一个标准的类型,因此我们需要通过 绑定到所需的类型StaticResource,即BasedOn="{StaticResource {x:Type ComboBox}}"。
我们再次运行该项目,你瞧,一切正常:
我将向您展示一个简单的示例,说明您应该具备什么,然后根据您的需要进行调整。
让我们在屏幕上有 2 个
ComboBox,其中一个负责另一个的“状态”,而另一个则根据这些数据改变其颜色。数据
由于 WPF 是关于绑定并将数据与 UI 分离的,所以我们根本不应该做这样的事情
comboBox1.Backgroud = ...;,这是不正确的,因为我们正在干扰来自 UI 的数据。那么,我们如何描述这些颜色、某些“状态”呢?一切都很简单,创建一个enum具有简单值和清晰名称的值。事实上,我们就这么做吧。让我们有enum,我们称之为Status,并让它有标准值“正常”,“成功”,“注意”,“错误”,我们会得到这样的东西:现在,让我们画出一个简单的类(ViewModel),它将包含 this
enum,以及 this 的所有值的列表enum,以及 的值的集合ComboBox。由于状态本身enum(我们的状态)必须在程序运行时发生变化,因此它必须调用INPC,不要忘记这一点,否则 UI 将不会接收到更改!结果,我的代码将是这样的:
这个不用
ObservableProperty理会ObservableObject,为了简单起见我用的CommunityToolkit.Mvvm,它给我生成的是一样的INotifyProprtyChanged,你在这里有权做你想做的事,主要是调用INPC,它的实现并不是那么重要。XAML
我们已经完成了数据处理,现在我们需要处理 UI。我们现在的任务本质上很简单,但是XAML 中的
if (Status == Warning) Background = Red;等效项是什么?if没错,就是触发器。实际上,我们的任务是将样式更改ComboBox为每个状态都有触发器的样式。最终结果将是这样的:还是那句话,不要讲究各种颜色
TextOnAccentFillColorPrimaryBrush,我用我自己的颜色,你自然会有你自己的。另请注意,在触发器中我指示了要更改的所有必要值。因此,如果您正确执行了所有操作,请运行它并查看结果:
有问题吧?我们的控件失去了标准样式,但是为什么呢?重点是,我们现在基本上已经做了类似的事情
comboBox1.Style = новый стиль,但“新风格”本身是空的,里面什么也没有。在需要添加到基类的情况下该怎么办?没错,如果他们允许,我们就继承,也就是我们去做новый стиль : старый стиль。在 XAML 中,您还可以继承样式;这是通过BaseOn.实际上,我们将其添加到此<Style TargetType="ComboBox">属性中,指示应从中继承的资源(名称/类型)。由于我们需要一个标准的类型,因此我们需要通过 绑定到所需的类型StaticResource,即BasedOn="{StaticResource {x:Type ComboBox}}"。我们再次运行该项目,你瞧,一切正常:
现在切换状态并欣赏结果:
正如您所看到的,一切正常,XAML 自动调整为绑定属性的值。
但请记住,如果您要添加到基本样式,那么值得研究它,否则您可能会错过一些东西并最终出现各种“故障”,例如,我有,当更改颜色时,鼠标悬停时颜色不会改变:
但这是一个完全不同的故事......
这实际上是根据数据中的某些内容更改 UI 中的某些内容的基本且最简单(正确)的方法之一。然后将其适应您的项目,在问题中我看到您谈论下拉列表的背景,因此尝试为它写一个触类旁通的样式。
顺便说一下,我没有完全理解你的问题,即“独特的颜色”。如果您需要为每个创建的颜色创建完全唯一的颜色
ComboBox,那么这种情况下的“颜色”已经是特定对象的特定数据,这意味着您需要创建一个类来描述特定对象并存储“ color”属性,然后你只需绑定这个属性ComboBox就可以了。事实上,在我看来,为每个 UI 组件提供“独特”的颜色已经是应用程序的糟糕用户体验,这只会分散用户的注意力。