我的WPF应用程序在其主窗口上有许多按钮。我现在正处理边缘情况,如果数据库关闭或者应用程序无法建立与其后端的连接(后端是我们编写的Windows服务),应该禁用按钮
我的视图模型库中有两个类,名为DbMonitor
和ComMonitor
(“通信”为“Com”)。它们来自同一个抽象类,实现IPropertyChanged
接口,并有一个名为Status
的属性(继承自抽象基类),这是一个名为DeviceStatuses
的枚举,其值为{{ 1}},Green
和Yellow
。我希望仅当两个对象的状态属性都是Red
时才启用按钮?
如何让这个绑定在Xaml中运行,或者我必须在我的代码隐藏中执行此操作。
由于
贝
答案 0 :(得分:4)
您是否使用带有这些按钮的命令?如果没有,你切换到命令有多难? CanExecute
的{{1}}部分似乎是前往此处的方式。
答案 1 :(得分:0)
有三种方法可以解决这个问题:
的 1。将按钮的IsEnabled propetry 绑定到Status属性,并使用Converter将DeviceStatus映射到bool(启用与否)。我不推荐这个。
的 2。路由命令:
public static RoutedCommand MyButtonCommand = new RoutedCommand();
private void CommandBinding_MyButtonEnabled(object sender, CanExecuteRoutedEventArgs e) {
e.CanExecute = Db.Monitor.Status==DeviceStatuses.Green;
}
并在XAML中绑定它:
<Window.CommandBindings>
<CommandBinding
Command="{x:Static p:Window1.MyButtonCommand}"
Executed="buttonMyButton_Executed"
CanExecute="CommandBinding_MyButtonEnabled" />
</Window.CommandBindings>
<Button Content="My Button" Command="{x:Static p:Window1.MyButtonCommand}"/>
第3。实施ICommand :
public class MyCmd : ICommand {
public virtual bool CanExecute(object parameter) {
return Db.Monitor.Status==DeviceStatuses.Green;
}
}
这里Command是相应视图模型的属性:
class MyViewModel {
public MyCmd myCcmd { get; set; }
}
并在XAML中绑定它:
<Button Content="My Button" Command="{Binding myCmd}"/>
第三种方法通常是最灵活的。您需要将具有您的状态属性的视图模型注入到Command构造函数中,以便您可以实现CanExecute逻辑。
答案 2 :(得分:0)
在提出问题之后,我做了一些额外的研究,找到了适合我的解决方案。
我创建了一个实现IMultiConverter接口的类,它将我的DeviceStatuses
枚举转换为bool。然后,在我的Xaml中,我这样做了:
<Button ....>
<Button.IsEnabled>
<MultiBinding Converter="{StaticResource DeviceStatusToBool}">
<Binding Path="..." />
<Binding Path="..." />
</MuntiBinding>
</Button.IsEnabled>
</Button>
这非常有效。
此时我无法将按钮转换为使用ICommand。在发布日期之前没有足够的时间。
贝