How to bind application commands to view model(WPF)?

↘锁芯ラ 提交于 2019-12-07 00:31:48

问题


I have already read Josh Smiths article about binding commands to view model using RelayCommand. However I need to bind ApplicationCommands.Save to a view model so that when a user clicks the save menu item it is handled in the window. How is it possible?


回答1:


The best solution I'm aware of us to use a service. For example, an ICommandBindingsProvider like this:

public interface ICommandBindingsProvider
{
    CommandBindingCollection CommandBindings { get; }
}

This gets injected into your ViewModel and used like this:

public MyViewModel(ICommandBindingsProvider commandBindings)
{
    commandBindings.Add(new CommandBinding(....));
}

How the service gets injected will be dependent on what MVVM framework you're using. Most (but not all) support some sort of service injection capabilities. If you need a more concrete code example, look at Onyx which does service injection and has a service that does just this.




回答2:


There is a good tutorial to help bind application commands.

  1. Setup your command binding collection for your view to bind to in your view model. e.g.:
public CommandBindingCollection CommandBindings { get; }

public YourViewModel()
{
//Create a command binding for the save command
var saveBinding = new CommandBinding(ApplicationCommands.Save, SaveExecuted, SaveCanExecute);

//Register the binding to the class
CommandManager.RegisterClassCommandBinding(typeof(YourViewModel), saveBinding);

//Adds the binding to the CommandBindingCollection
CommandBindings.Add(saveBinding);
}
  1. Setup attached properties. Read the article on how to do that.

  2. Then bind to it using attached properties.

<UserControl local:AttachedProperties.RegisterCommandBindings="{Binding CommandBindings}"> 
    <Window.DataContext>
        <local:YourViewModel></local:YourViewModel>
    </Window.DataContext>
</UserControl>



回答3:


How is your save menu item being created? Somewhere it must be getting bound to the ApplicationCommands.Save? You can change that so that it binds to your ViewModel's save instead.




回答4:


I have used this approach successfully in the past:

Start out by defining a CommandBindings property on ViewModels (same definition as on Views).

Then for each Command implemented by ViewModel, add a CommandBinding to ViewModel's CommandBindings.

Then, when you set:

view.DataSource = viewModel;

Also set:

view.CommandBindings.AddRange(viewModel.CommandBindings);

I think may be done using a binding of the CommandBindings property (can't remember for sure).




回答5:


Or, you place the save command binding on the viewmodel, and then databind to it, something like (pseudo code)

in the viewmodel:

...
public Command SaveCommand { get { return yourCodeHere; } }
...

in the view:

<Button Command="{Binding Path=SaveCommand}" Content="Click"/>    

Update: i just tried binding to a command in a commandbinding and it doesn't work. what i was thinking of was binding to a command.



来源:https://stackoverflow.com/questions/6048501/how-to-bind-application-commands-to-view-modelwpf

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!