如果不满足多个条件,需要禁用窗口上的按钮

时间:2012-05-07 21:04:20

标签: wpf data-binding binding

我的WPF应用程序在其主窗口上有许多按钮。我现在正处理边缘情况,如果数据库关闭或者应用程序无法建立与其后端的连接(后端是我们编写的Windows服务),应该禁用按钮

我的视图模型库中有两个类,名为DbMonitorComMonitor(“通信”为“Com”)。它们来自同一个抽象类,实现IPropertyChanged接口,并有一个名为Status的属性(继承自抽象基类),这是一个名为DeviceStatuses的枚举,其值为{{ 1}},GreenYellow。我希望仅当两个对象的状态属性都是Red时才启用按钮?

如何让这个绑定在Xaml中运行,或者我必须在我的代码隐藏中执行此操作。

由于

3 个答案:

答案 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。在发布日期之前没有足够的时间。