Как связать команды приложения для просмотра модели (WPF)? - PullRequest
6 голосов
/ 18 мая 2011

Я уже читал статью Джоша Смита о связывании команд для просмотра модели с помощью RelayCommand.Однако мне нужно связать ApplicationCommands.Save с моделью представления, чтобы при щелчке пользователем элемента меню «Сохранить» он обрабатывался в окне.Как это возможно?

Ответы [ 5 ]

1 голос
/ 11 июля 2014

Существует хорошее руководство , которое поможет связать команды приложения.

  1. Настройте коллекцию привязок команд, чтобы ваш вид связывался в вашей модели представления. 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. Настройка вложенных свойств. Прочтите статью о том, как это сделать.

  2. Затем привяжите его, используя прикрепленные свойства.

<UserControl local:AttachedProperties.RegisterCommandBindings="{Binding CommandBindings}"> 
    <Window.DataContext>
        <local:YourViewModel></local:YourViewModel>
    </Window.DataContext>
</UserControl>
1 голос
/ 18 мая 2011

Лучшее решение, которое я знаю о нас, чтобы использовать услугу.Например, ICommandBindingsProvider, такой как:

public interface ICommandBindingsProvider
{
    CommandBindingCollection CommandBindings { get; }
}

Это внедряется в вашу ViewModel и используется следующим образом:

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

То, как сервис вводится, будет зависеть от того, какую среду MVVM выИспользуешь.Большинство (но не все) поддерживают какие-то возможности внедрения сервисов.Если вам нужен более конкретный пример кода, посмотрите на Onyx , который выполняет внедрение службы и имеет службу, которая делает именно это.

0 голосов
/ 18 мая 2011

Я успешно использовал этот подход в прошлом:

Начнем с определения свойства CommandBindings для ViewModels (то же определение, что и для Views).

Затем дляДля каждой команды, реализуемой ViewModel, добавьте CommandBinding в CommandBindings ViewModel.

Затем, когда вы установите:

view.DataSource = viewModel;

Также установите:

view.CommandBindings.AddRange(viewModel.CommandBindings);

Я думаю, что может бытьсделано с помощью привязки свойства CommandBindings (точно не помню).

0 голосов
/ 18 мая 2011

Или, вы помещаете привязку команды сохранения в модель представления, а затем привязываете к ней данные, например, (псевдокод)

в модели представления:

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

в представлении:

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

Обновление: Я только что попытался привязать команду к привязке команды, и она не работает.то, о чем я думал, было связано с командой .

0 голосов
/ 18 мая 2011

Как создается ваш пункт меню сохранения? Где-то это должно быть связано с ApplicationCommands.Save? Вы можете изменить это так, чтобы оно связывалось с сохранением вашей ViewModel.

...