2012-02-18 6 views
3

私は、XAMLで(WPF-MDI使用して)定義された3つのメニュー項目があります。コマンド

<MenuItem Header="_Generic" Name="Generic" ToolTip="Generic Visual Studio designer theme" 
      Command="{Binding Path=SelectGenericTheme}"/> 
<MenuItem Header="_Luna" Name="Luna" ToolTip="Blue Windows XP theme" 
      Command="{Binding Path=SelectLunaTheme}"/> 
<MenuItem Header="_Aero" Name="Aero" ToolTip="Windows Vista/7 theme" 
      Command="{Binding Path=SelectAeroTheme}"/> 

とのViewModelのコマンドと現在の選択の定義:

public enum ESelectedTheme 
    { 
     Generic, 
     Luna, 
     Aero 
    } 

    ESelectedTheme _selectedTheme; 

    ICommand _selectGenericThemeCommand; 
    public ICommand SelectGenericThemeCommand 
    { 
     get { return _selectGenericThemeCommand ?? (_selectGenericThemeCommand = new RelayCommand(param => SelectGenericTheme(), 
      param => true)); } 
    } 

    void SelectGenericTheme() 
    { 
     _selectedTheme = ESelectedTheme.Generic; 
    } 


    ICommand _selectLunaThemeCommand; 
    public ICommand SelectLunaThemeCommand 
    { 
     get 
     { 
      return _selectLunaThemeCommand ?? (_selectLunaThemeCommand = new RelayCommand(param => SelectLunaTheme(), 
       param => true)); 
     } 
    } 

    void SelectLunaTheme() 
    { 
     _selectedTheme = ESelectedTheme.Luna; 
    } 


    ICommand _selectAeroThemeCommand; 
    public ICommand SelectAeroThemeCommand 
    { 
     get 
     { 
      return _selectAeroThemeCommand ?? (_selectAeroThemeCommand = new RelayCommand(param => SelectAeroTheme(), 
       param => true)); 
     } 
    } 

    void SelectAeroTheme() 
    { 
     _selectedTheme = ESelectedTheme.Aero; 
    } 

私は2つの質問(1つのポストの内側に許可されている希望)持っている:私は私の値にXAMLでにisCheckedプロパティをバインドしたい

  1. を選択された(_選択されたテーマ)。私はコンバータを書く必要があると思うが、私はどのようにわからない。
  2. 私は3つのICommandsを作成しました(テーマごとに1つ)... 20テーマがあれば...このコードをパラメータ化する方法はありますか?

ありがとうございます。

+2

['CommandParameter'](http://msdn.microsoft.com/en-us/library/system.windows.controls.menuitem.commandparameter.aspx)を指定することができます。コマンドのパラメータ化方法?あなたはいつも 'param => ...'を無視していますか? –

+0

parameterizeとは、3つのコマンドの代わりに1つのコマンドだけを使用することを意味します(ただし、CommandParameterの動作方法を確認します)。コメントありがとう。 –

+0

'RelayCommand(T)'では、述語として 'true'を渡すのは意味がありません。 –

答えて

5

バインディングはすべてを実行するので、コマンドをパラメータ化する必要はありませんが、前述のようにCommandParameterを使用すると可能です。ここで、コンバータはenumパラメータを取得します。

例:XAMLは冗長まだあるので

public class EnumToBooleanConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     // You could also directly pass an enum value using {x:Static}, 
     // then there is no need to parse 
     string parameterString = parameter as string; 
     if (parameterString == null) 
      return DependencyProperty.UnsetValue; 

     if (Enum.IsDefined(value.GetType(), value) == false) 
      return DependencyProperty.UnsetValue; 

     object parameterValue = Enum.Parse(value.GetType(), parameterString); 

     return parameterValue.Equals(value); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     string parameterString = parameter as string; 
     if (parameterString == null) 
      return DependencyProperty.UnsetValue; 

     return Enum.Parse(targetType, parameterString); 
    } 
} 

を(冗長!)あなたがItemsSourceのを結合することによって、それをさらに取ることができる:

<MenuItem Header="_Description" IsCheckable="True" 
     IsChecked="{Binding Path=DisplayMode_Current, 
          Converter={StaticResource EnumToBooleanConv}, 
          ConverterParameter=Description}" /> 
<MenuItem Header="_Web-Page" IsCheckable="True" 
     IsChecked="{Binding Path=DisplayMode_Current, 
          Converter={StaticResource EnumToBooleanConv}, 
          ConverterParameter=WebPage}" /> 

コンバータはこのような何かを見ることができます列挙値に親MenuItemを追加し、次にItemTemplateItemContainerStyleで作業してください。

+0

Iこれを試すには時間が必要です...努力のおかげで! –

+0

私はSelectedTheme(ViewModelのプロパティ)はdependencypropertyでなければならないと思いますか?もしそうなら...私はまだWPFについて多くのことを学ぶ必要があります。 –

+1

@MichelKeijzers:いいえ、VMの依存関係プロパティを使用しないでください。[INPC](http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx)と[実装方法](http://msdn.microsoft.com/en-us/library/ms229614.aspx)、右ですか?それはバインディング通知のためにそのインタフェースを実装する通常のプロパティでなければなりません。 –