0

私の WPF アプリケーションには、メイン ウィンドウに多数のボタンがあります。私は現在、データベースがダウンしている場合、またはアプリケーションがバックエンドへの接続を確立できない場合にボタンを無効にする必要があるエッジ ケースに取り組んでいます (バックエンドは、私たちが作成した Windows サービスです)。 .

DbMonitorビュー モデル ライブラリには、 and ComMonitor(「Communications」の「Com」)と呼ばれる 2 つのクラスがあります。それらは同じ抽象クラスから派生し、IPropertyChangedインターフェイスを実装し、値、、および でStatus呼び出される列挙である (抽象基本クラスから継承された)と呼ばれるプロパティを持ちます。両方のオブジェクトの Status プロパティが?DeviceStatusesGreenYellowRedGreen

このバインドを Xaml で機能させるにはどうすればよいですか、またはコード ビハインドでこれを行う必要がありますか。

ありがとう

トニー

4

3 に答える 3

4

これらのボタンでコマンドを使用していますか? そうでない場合、コマンドに切り替えるのはどれくらい難しいですか? のCanExecute部分はICommand、ここに行く方法のようです。

于 2012-05-07T21:42:16.267 に答える
0

これには 3 つの方法があります
。 1. ボタンの IsEnabledプロパティを Status プロパティにバインドし、Converter を使用して DeviceStatus から bool (有効または無効) にマップします。私はこれをお勧めしません。
2. RoutedCommands :

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}"/>

通常、3 番目のアプローチが最も柔軟です。CanExecute ロジックを実装できるように、ステータス プロパティを持つビュー モデルを Command コンストラクターに挿入する必要があります。

于 2012-05-07T21:49:12.030 に答える
0

質問した後、さらに調査を行い、自分に合った解決策を見つけました。

DeviceStatuses列挙型を boolに変換する IMultiConverter インターフェイスを実装するクラスを作成しました。次に、Xaml で次のようにしました。

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

これは非常にうまく機能します。

この時点では、ICommand を使用するようにボタンを変換できません。リリース日までに十分な時間がありません。

トニー

于 2012-05-08T00:27:37.650 に答える