gpt4 book ai didi

c# - 如何处理 WPF MVVM 窗口上 11 个按钮的 Visibility 和 IsEnabled?

转载 作者:行者123 更新时间:2023-12-03 10:27:04 25 4
gpt4 key购买 nike

我有一个从 native 代码调用的委托(delegate)来告诉每个按钮的 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 和 Visbility 绑定(bind)一对听起来不合理。这应该怎么做?

View 模型:
    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
}

枚举:
    public enum FieldStateSet 
{
Undefined = 0,
Inactive = 1,
Active = 2,
Visible = 3,
Hidden = 4
}

值 Hidden 始终映射到 Visibilty.Collapsed。

这是 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; }

你不应该使用 Visibility在 ViewModel 中,您应该使用 bool在 ViewModel 中,然后在 View 中使用转换器将其转换为 Visibility类型。 ViewModel 应始终为 POCO .

其次,如果不想在ViewModel中做22个属性,可以将它们组合成2个 ObservableDictionary属性(例如 public ObservableDictionary<bool> ButtonIsEnabled { get; set }public ObservableDictionary<bool> ButtonIsVisible { get; set } )。

如果您不想使用 ObservableDictionary ,您仍然可以使用普通的 Dictionary ,并手动调用 OnPropertyChanged当您修改字典中的任何内容时。

字典的键是按钮的名称,而值很好..值。

在您的 View 中,您绑定(bind)到字典属性,并为每个属性实现一个转换器。您需要指定 ConverterParameter (按钮名称)为每个按钮的绑定(bind),并让转换器从字典中检索值。

这可能不是最优雅的方式,也绝对不是一种简单/容易的方式。你会花更多的时间来做这件事,而不是在 ViewModel 中做 22 个属性。就个人而言,我只是将 22 个属性放在 ViewModel 中并用 #region 包装它们。 ,然后折叠它 - 这样我在处理 ViewModel 时就看不到它们。

关于c# - 如何处理 WPF MVVM 窗口上 11 个按钮的 Visibility 和 IsEnabled?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38111214/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com