如何处理WPF MVVM窗口上11个按钮的可见性和IsEnabled
本文关键字:按钮 11个 可见性 IsEnabled 窗口 MVVM 何处理 处理 WPF | 更新日期: 2023-09-27 17:53:39
我有一个从本机代码调用的委托来告诉每个按钮的Visibility和IsEnabled。创建22个属性,比如
bool Insert_BtnSaveIsEnabled {get; set; }
Visibility Insert_BtnSaveVisibility {get; set; }
bool Insert_BtnSelectObjectsIsEnabled {get; set; }
Visibility Insert_BtnSelectObjectsVisibility {get; set; }
到ViewModel,并在XAML中为每个按钮的IsEnabled和visibility绑定一对,这听起来不合理。如何做到这一点?
ViewModel:
private int ControlsStateChange(string control, CommonDllInterface.FieldStateSet state)
{
//here I could have huge if-else clause
//to determine one of 22 properties to set
//and the value to assign to it
}
enum: public enum FieldStateSet
{
Undefined = 0,
Inactive = 1,
Active = 2,
Visible = 3,
Hidden = 4
}
value Hidden总是映射到visibility . collapse .
下面是XAML的一部分(它很复杂/很长,所以这几个按钮应该作为一个例子):
<Button Name="Insert_BtnSave" Command="{ui:CommandHandler CommonCommandshandler}">
<Image Source="{Binding Converter={StaticResource nameToBitmapSource}}" DataContext="BmpSaveSettings" />
</Button>
<Button Name="Insert_BtnSelectObjects" Command="{ui:CommandHandler CommonCommandshandler}">
<Image Source="{Binding Converter={StaticResource nameToBitmapSource}}" DataContext="BmpBrwse" />
</Button>
<Button Name="Insert_BtnSelectPL" Command="{ui:CommandHandler CommonCommandshandler}" Visibility="{Binding Visibility}">
<Image Source="{Binding Converter={StaticResource nameToBitmapSource}}" DataContext="BmpPlanProperties" />
</Button>
<Button Name="Insert_BtnCopy" Command="{ui:CommandHandler CommonCommandshandler}" IsEnabled="{Binding IsEna}">
<Image Source="{Binding Converter={StaticResource nameToBitmapSource}}" DataContext="BmpCopy" />
</Button>
<Button Name="Insert_BtnDelete" Command="{ui:CommandHandler CommonCommandshandler}">
<Image Source="{Binding Converter={StaticResource nameToBitmapSource}}" DataContext="BmpDelete" />
</Button>
<Button Name="Insert_BtnEditProps" Command="{ui:CommandHandler CommonCommandshandler}">
<Image Source="{Binding Converter={StaticResource nameToBitmapSource}}" DataContext="BmpOfflineProperties" />
</Button>
XAML中的按钮名称对应于delegate中的控件参数值。
首先,我假设下面是ViewModel:
bool Insert_BtnSaveIsEnabled {get; set; }
Visibility Insert_BtnSaveVisibility {get; set; }
你不应该在ViewModel中使用Visibility
,你应该在ViewModel中使用bool
,然后在View中使用转换器将其转换为Visibility
类型。ViewModel应该始终是POCO。
其次,如果你不想在ViewModel中创建22个属性,你可以将它们组合成2个ObservableDictionary属性(例如public ObservableDictionary<bool> ButtonIsEnabled { get; set }
和public ObservableDictionary<bool> ButtonIsVisible { get; set }
)。
如果您不想使用ObservableDictionary
,您仍然可以使用普通的Dictionary
,并在修改字典中的任何内容时手动调用OnPropertyChanged
。
字典的键是按钮的名称,而值是well..价值。
在View中,绑定到字典属性,并为每个属性实现一个转换器。您需要为每个按钮的绑定指定ConverterParameter
(按钮名称),并让转换器从字典中检索值。
这可能不是最优雅的方法,也绝对不是一个简单/容易的方法。这样做要比处理ViewModel中的22个属性花费更多的时间。就我个人而言,我会把22个属性放在ViewModel中,用#region
包装它们,然后折叠它,这样当我在我的ViewModel上工作时我就看不到它们了。