Выполнить команду usercontrol из модели представления - PullRequest
0 голосов
/ 30 августа 2010

У меня есть usercontrol с командой, что я хотел бы сделать, это выполнить эту команду из ViewModel содержащего представления.

Это было бы легко сделать в коде, так как я мог просто перейти к «UserControl.MyCommand.Execute», но, конечно, я хочу быть в состоянии сделать это во ViewModel.

Теоретически, я хотел бы связать Команду UserControl с Командой на ViewModel, которую я могу выполнить, и затем она будет обработана UserControl. Как то так:

...
<local:MyControl
         MyCommand="{Binding ViewModelsCommand}" />
...

Конечно, это окажет противоположное влияние на то, что я хочу сделать, так как теперь ViewModelsCommand привязан к MyCommand. Так как же это инвертировать?

По сути, я хочу иметь возможность связать что-то вроде этого:

ViewModelsCommand = "{Binding MyControl.MyCommand}"

Будут приветствоваться любые идеи или вдохновение, я не вижу обязательного режима, который позволил бы мне сделать это. И я не уверен, как получить доступ к свойствам DataContext для привязки (обычно вам нужно просто выполнить связывание и обработать это двумя способами, но, конечно, это не работает в этом сценарии).

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 31 августа 2010

Вы создаете экземпляр модели представления в конструкторе представления.

Почему бы не установить значение явно при создании?

 public SomeView()
 {
      var viewModel = new SomeViewModel();
      viewModel.ViewModelCommand = MyCommand; // or = myControl.MyCommand

      DataContext = viewModel;
 }

В можно использовать привязку с OneWayToSource, TwoWay или Explicit, но вам все равно придется явно обновить источник хотя бы один раз в коде (всегда, если вы используете Explicit).

myControl.GetBindingExpression(MyControl.MyCommandProperty).UpdateSource();
0 голосов
/ 31 августа 2010

Я использую EventAggregator PRISM или Messenger MVVMLight, чтобы позволить двум ViewModel говорить, но ваш случай выглядит немного иначе, когда у вас есть представление (UserControl), говорящее с ViewModel.

0 голосов
/ 31 августа 2010

Обратите внимание, следующий ответ не является правильным.Кажется, что OneWayToSource обновляется только после изменения свойства target.Однако я не удаляю этот ответ, чтобы сообщить другим людям, которые не знают об этом поведении (например, я).

Старый ответ (см. Текст выше)

IMO ваш пример должен работать (если MyControl.MyCommand является открытым свойством, которое возвращает ICommand).Вы пробовали BindingMode OneWayToSource?

<local:MyControl 
         MyCommand="{Binding ViewModelsCommand,Mode=OneWayToSource}" /> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...