开发者

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

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?


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.


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>


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.


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).


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜