2017-03-27 12 views
1

私は簡単な問題を解決する時間を探しています。私は、私のmenuItemsで "SelectedItem"で作業したいと思っていましたが、何時間ものstackoverflowの後、私はそれが不可能であることがわかりました。私は "CommandParameter"について多くを見つけましたが、どのように動作するのか分かりません。 これは私がやりたいことです:私は "background1、background2、..."というメニューを持っています。メニューの背景を選択した場合、その背景を背景として設定したいと思います。WPF selectedItem on menuまたはviewmodelのコマンドパラメータを取得

これは学校プロジェクトなので、MVVMを使用する必要があり、コードビハインドは許可されていません。 ViewModelでCommandパラメータを「使用」するにはどうすればよいですか?

これは私のmainWindow.xamlです:

   <Toolbar> 
        <Menu> 
        <MenuItem Header="Background" ItemsSource="{Binding Backgrounds}"> 
         <MenuItem.ItemTemplate> 
          <DataTemplate> 
           <MenuItem Header="{Binding Name}" Command="{Binding ChangeBackgroundCommand}" CommandParameter="{Binding Name}"/> 
          </DataTemplate> 
         </MenuItem.ItemTemplate> 
        </MenuItem> 
        </Menu> 
       </Toolbar> 

これは私のmainWindowViewModelの一部です:

我々はbaseCommandクラスを使用
public MainWindowViewModel() 
    { 
     //load data 
     BackgroundDataService bds = new BackgroundDataService(); 
     Backgrounds = bds.GetBackgrounds(); 

     //connect command 
     WijzigBackgroundCommand = new BaseCommand(WijzigBackground); 
    } 
private void ChangeBackground() 
    { 
     //I want here the name of the selected menuItem (by parameter?) 
    } 

}

(私はしたくありませんそのクラスを私が考えるから変更してください):

class BaseCommand : ICommand 
{ 
    Action actie; 

    public BaseCommand(Action Actie) 
    { 
     actie = Actie; 
    } 

    public event EventHandler CanExecuteChanged; 

    public bool CanExecute(object parameter) 
    { 
     return true; 
    } 

    public void Execute(object parameter) 
    { 
     actie.Invoke(); 
    } 
} 

私はこの:-) stackoverflowの多くを使用するには、私の最初のポスト/質問ですが、私はそれが

+0

class BaseCommand<T> : ICommand { private readonly Action<T> _executeMethod = null; private readonly Func<T, bool> _canExecuteMethod = null; public BaseCommand(Action<T> executeMethod) : this(executeMethod, null) { } public BaseCommand(Action<T> executeMethod, Func<T, bool> canExecuteMethod) { _executeMethod = executeMethod; _canExecuteMethod = canExecuteMethod; } public bool CanExecute(T parameter) { if (_canExecuteMethod != null) { return _canExecuteMethod(parameter); } return true; } public void Execute(T parameter) { if (_executeMethod != null) { _executeMethod(parameter); } } public event EventHandler CanExecuteChanged; bool ICommand.CanExecute(object parameter) { if (parameter == null && typeof(T).IsValueType) { return (_canExecuteMethod == null); } return CanExecute((T)parameter); } void ICommand.Execute(object parameter) { Execute((T)parameter); } } 

このようにそれを使用します "wijzig"は "変更"のためのオランダです(私はすべてを翻訳しませんでした) それは正しいですか、問題ではありません、ごめんなさい –

+0

CommandParameter = "{Binding}"はメニューのDataContextを渡しますアイテムをコマンドに追加するだけです(名前を渡すよりも優れています)。問題は、BaseCommandの実装が駄目だということです。つまり、アクション(または適切に汎用でありアクション)を取るべきであり、 'Execute'が呼び出されると、パラメータオブジェクトをアクションに渡す必要があります。こうすることで、ビューモデル(BaseCommandに渡されたアクションを制御する)でコマンドパラメータを取得し、それに応じて背景を変更することができます。 – Will

+0

私はそれを変更しようとします、私はそれが解決したときに返信します、ありがとう –

答えて

1

はこれを試してみてください明確に願っています:私が作る悲しいこと

public MainWindowViewModel() 
{ 
    // ... 

    // connect command 
    WijzigBackgroundCommand = new BaseCommand<YourBackgroundClass>(
     (commandParam) => WijzigBackground(commandParam), 
     (commandParam) => CanWijzigBackground(commandParam)); 
} 

private void WijzigBackground(YourBackgroundClass param) 
{ 
    // Use 'param' 
} 

private bool CanWijzigBackground(YourBackgroundClass param) 
{ 
    // Use 'param' 
} 
+0

ありがとう!私はそれを働かせたらあなたに知らせるでしょう、朝にそれを最初に試してみます –

+0

ありがとう、それは働いた! –

関連する問題