2012-05-07 9 views
0

私のWPFアプリケーションには、メインウィンドウに多数のボタンがあります。私は、データベースがダウンしている場合、またはアプリケーションがバックエンド(バックエンドは、私たちが書いたWindowsサービス)への接続を確立できない場合、ボタンを無効にする必要があるエッジケースで作業しています。 。いくつかの条件が満たされない場合、ウィンドウ上のボタンを無効にする必要があります

ビューモデルライブラリには、DbMonitorComMonitorという2つのクラスがあります(「通信」では「Com」)。それらは、同じ抽象クラスから降りて、IPropertyChangedインターフェイスを実装し、値Green,Yellow、およびRedを持つDeviceStatusesという列挙体であるStatus(抽象基底クラスから継承)というプロパティを持ちます。両方のオブジェクトのStatusプロパティがGreenの場合にのみ、ボタンを有効にしますか?

このバインディングをXamlで動作させるにはどうすればよいですか、それともコードビハインドでこれを行う必要がありますか。

おかげ

トニー

答えて

0

質問をした後、私はいくつかの追加調査を行い、私に適した解決策を見つけました。

DeviceStatusesの列挙をboolに変換するIMultiConverterインターフェイスを実装するクラスを作成しました。そして、私のXamlで、私はこれをしました:

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

これは非常にうまくいきます。

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

トニー

+0

は、あなたが本当にあなたが本当のViewModelを使用したい場合は委任/ RelayCommandのものを検討する必要があり...あなたのコードがはるかに容易になり – blindmeis

+0

あなたはVMブールButtonIsEnabledでプロパティを宣言し、直接ボタンとそれを結合することができプロパティIsEnabled = "{Binding ButtonIsEnabled}"であり、VMでは、条件に基づいてButtonIsEnabledをtrueまたはfalseに設定できます。しかし、ICommandを使用することができます。 –

4

あなたは、これらのボタンでコマンドを使用していますか?もしそうでなければ、コマンドに切り替えるのはどれくらい難しいでしょうか? CanExecuteの部分はICommandのように見えます。

0

これについて移動する3つの方法があります。
あなたのボタンの1バインドでIsEnabledのpropetry(有効かどうか)BOOLにDeviceStatusからマッピングするためのコンバータを使用してStatusプロパティには。私はこれをお勧めしません。
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; 
    } 
} 

ここでコマンドのプロパティです適切なビューモデル:

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

、あなたはXAMLでそれにバインド:

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

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

関連する問題