将 属性 值映射到条件

Mapping property values to conditions

我是 WPF 和 C# 的新手。我的 GUI 中有一个显示为图像的按钮。但是,显示的图像取决于某些条件。根据条件,按钮可能是 5 个图像之一。我已经这样编码了:

查看:

<Button x:Name="bShow" HorizontalAlignment="Left" Margin="200,0,0,0" VerticalAlignment="Top" Width="200" Height="200" >
        <Image Source="{Binding myShowProp}"/>

属性 myShowProp 定义在 MainWindow.xaml.cs :

public string myShowProp // This property decides what image appears inside the button
{
    get { return privProp; }
    set 
    { 
        privProp = value;
        OnPropertyChanged("myShowProp");
    }
}

一个名为 SetButtonImage 的例程负责将特定条件映射到特定图像的逻辑。它在 MainWindow.xaml.cs 中编码为:

private void SetButtonImage() 
{
     if ( /* condition1 */)
         myShowProp = image1;
     else if ( /* condition2 */)
         myShowProp = image2;
     else if ( /* condition3 */)
         myShowProp = image3;
     else if ( /* condition4 */)
         myShowProp = image4;
     else
         myShowProp = image5;

}

你能告诉我一个更好的方法来完成上述操作吗,我不认为 if 的普遍使用是最好的设计,似乎我遗漏了什么。

这背后的另一个动机是我有一个设计师,如果这是你可以在 BLend 中做的事情,在控件属性级别,那么我宁愿让他在 blend 中做,而不是添加到代码中-后面。

P.S。我要做的其中一件事是按照 MVVM 范式重构我现有的代码。

当你有复杂的条件时,长 If-Else 语句是必要的。如果它是单个条件的多个状态,那么 switch 语句将为您简化它。只需确保您在设置器中为在这些条件下使用的任何属性调用 SetButtonImage() 就可以了。

myShowProp 属性 是否只是为按钮获取图片提供图片地址?如果是这样,那是您可以更改内容以更符合 MVVM 的地方。您希望 属性 仅提供状态,最好是描述状态的名称,然后您的 GUI 设计人员将使用该名称来确定图像。他将能够使用资源和可能的样式触发器来显示正确的图像。

我使用 MVVM 已经一年多了,我认为我做得不错,你发布的代码对我来说很好。

WPF 应该与 MVVM(模型-视图-视图模型)模式一起使用,该模式使用 DataBinding(已在使用)和模板化等概念,更具体地说,ControlTemplates 与触发器的使用(在按钮上)。

想法是:

  • 您将有五个 ImageSources,在 Button.Resources;
  • 中声明
  • 您的 ViewModel 上会有枚举 属性(不是字符串!);
  • 您的按钮将有一个包含图像的 DataTemplate;
  • 图像的源将由绑定到该枚举的一系列触发器定义 属性。