将 属性 值映射到条件
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;
- 图像的源将由绑定到该枚举的一系列触发器定义 属性。
我是 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;
- 图像的源将由绑定到该枚举的一系列触发器定义 属性。