2012-02-12 13 views
1

私はMDIソリューション(http://wpfmdi.codeplex.com/参照)とMVVMを使用しています。MVVM/MDIアプリケーションで重複しているRelayCommandsを防ぐ

私はのように、メインのViewModelに、ツールバーおよび/またはメニューをバインドする1 RelayCommandを使用

:しかし、子ウィンドウでは、同じ機能のボタンをバインドするために、私はどの別のRelayCommandが必要

ICommand _editSelectedItemCommand; 
    public ICommand EditSelectedItemCommand 
    { 
     get 
     { 
      return _editSelectedItemCommand ?? (_editSelectedItemCommand = new RelayCommand(param => CurrentChildViewModel.EditSelectedItem(), 
       param => ((CurrentChildViewModel != null) && (CurrentChildViewModel.CanExecuteEditSelectedItem)))); 
     } 
    } 

メソッドEditSelectedItemとCanExecuteEditSelectedItemを直接呼び出す点を除いて、ほぼ同等です。

ICommand _editSelectedItemCommand; 
    public ICommand EditSelectedItemCommand 
    { 
     get 
     { 
      return _editSelectedItemCommand ?? (_editSelectedItemCommand = new RelayCommand(param => EditSelectedItem(), 
       param => CanExecuteEditSelectedItem)))); 
     } 
    } 

私はこのようなコマンドを約10個、将来はおそらく50個以上必要としますので、今すぐ正しい方法でやりたいと思います。 これを防止するための方法はありますか?

答えて

2

メインビューモデルから最初のコマンドを削除することができます。これは、子ビューモデルのコマンドが十分であるためです。

ちょうどXAMLマークアップでは、このようにバインディングを使用します。また

<Button Command="{Binding CurrentChildViewModel.EditSelectedItemCommand}" 
     Content="Button for the main view model" /> 

を私が正しくあなたのコードを理解していれば、それはCurrentChildViewModelプロパティがnullの場合、コマンドは無効になりますよりも、という規定があります。あなたがそのような行動が必要な場合は 、あなたはあなたのコードにこのコンバーターを追加して、わずかに結合書き換える必要があります。

public class NullToBooleanConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return value != null; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

XAML:それは働いていたかどうかを確認するために少し時間がかかりました

<Application.Resources> 
    <local:NullToBooleanConverter x:Key="NullToBooleanConverter" /> 
</Application.Resources> 
<!-- your control --> 
<Button Command="{Binding CurrentChildViewModel.EditSelectedItemCommand}" 
     IsEnabled="{Binding CurrentChildViewModel, Converter={StaticResource NullToBooleanConverter}}" /> 
+0

申し訳ありませんが(IをWPFの初心者なので、ここで何か変更するには時間がかかりました)。あなたのソリューションはすばらしく動作し、コンバータについてもう少し分かりました。解決に時間を割いてくれてありがとう! –

+0

私はそれをテストし、それは動作します、ありがとう。しかし、いくつかの方法では、IsEnabled = {Binding CurrentChildViewModel.CanExecuteSelectedItem}を呼び出して、その関数内でロジックを実装しなければならない場合や、その場合にConvertorが必要な場合、もっと複雑なIsEnabled機能が必要です。前もって感謝します。 –

+0

私は追加の質問をhttp://stackoverflow.com/questions/9274498/relaycommands-from-view-to-child-viewに追加しました...私はこれが 'normal作業の方法'。 –

関連する問題