如何处理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中的控件参数值。

如何处理WPF MVVM窗口上11个按钮的可见性和IsEnabled

首先,我假设下面是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上工作时我就看不到它们了。