0

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

在我的视图模型库中有两个类,称为DbMonitorComMonitor(“Com”表示“Communications”)。它们来自同一个抽象类,实现IPropertyChanged接口,并有一个名为Status(继承自抽象基类)的属性,它是一个DeviceStatuses用 values GreenYellow和调用的枚举Red。我希望仅当两个对象的状态属性都为时才启用按钮Green

如何让这个绑定在 Xaml 中工作,或者我必须在我的代码隐藏中这样做。

谢谢

托尼

4

3 回答 3

4

您是否使用带有这些按钮的命令?如果不是,您切换到命令有多难?的CanExecute部分ICommand似乎是去这里的路。

于 2012-05-07T21:42:16.267 回答
0

有三种方法可以解决这个问题:
1. 使用 Converter 将按钮的 IsEnabled 属性绑定到 Status 属性,以从 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;
    }
}

这里的命令是适当视图模型的属性:

class MyViewModel {
    public MyCmd myCcmd { get; set; }
}

并在 XAML 中绑定到它:

<Button Content="My Button" Command="{Binding myCmd}"/>

第三种方法通常是最灵活的。您需要将具有您的状态属性的视图模型注入到 Command 构造函数中,以便您可以实现 CanExecute 逻辑。

于 2012-05-07T21:49:12.030 回答
0

问完这个问题后,我做了一些额外的研究,找到了一个适合我的解决方案。

我创建了一个实现 IMultiConverter 接口的类,该接口将我的DeviceStatuses枚举转换为 bool。然后,在我的 Xaml 中,我这样做了:

<Button ....>
    <Button.IsEnabled>
        <MultiBinding Converter="{StaticResource DeviceStatusToBool}">
            <Binding Path="..." />
            <Binding Path="..." />
        </MuntiBinding>
    </Button.IsEnabled>
</Button>

这很好用。

此时我无法将按钮转换为使用 ICommand。在我们的发布日期之前没有足够的时间。

托尼

于 2012-05-08T00:27:37.650 回答