У меня есть пользовательское управление с помощью команды, и я хотел бы выполнить эту команду из ViewModel, содержащего представление.
Это было бы легко сделать в коде позади, так как я мог бы просто пойти «UserControl.MyCommand.Execute», но, конечно, я хочу иметь возможность делать это в ViewModel.
Теоретически я хотел бы привязать команду UserControl к команде в ViewModel, которую я могу выполнить, а затем будет обрабатываться UserControl. Что-то вроде этого:
...
<local:MyControl
MyCommand="{Binding ViewModelsCommand}" />
...
Конечно, это будет иметь противоположный эффект по сравнению с тем, что я хочу сделать, поскольку теперь ViewModelsCommand привязан к MyCommand. Итак, как это перевернуть?
В основном я хочу привязать что-то вроде этого:
ViewModelsCommand = "{Binding MyControl.MyCommand}"
Приветствуются любые идеи или вдохновение, я не вижу режима привязки, который позволил бы мне это сделать. И я не уверен, как получить доступ к свойствам DataContext для привязки (обычно вы просто выполняете привязку и обрабатываете это двумя способами, но, конечно, это не работает в этом сценарии).
Заранее спасибо.
3 ответа
Вы создаете экземпляр модели представления в конструкторе представления.
Почему бы не установить значение явно при построении?
public SomeView()
{
var viewModel = new SomeViewModel();
viewModel.ViewModelCommand = MyCommand; // or = myControl.MyCommand
DataContext = viewModel;
}
можно использовать привязку с OneWayToSource
, TwoWay
или Explicit
, но вам все равно придется явно обновить исходный код хотя бы один раз в коде (всегда, если вы используете Explicit
).
myControl.GetBindingExpression(MyControl.MyCommandProperty).UpdateSource();
Я использую PRISM EventAggregator или MVVMLight Messenger, чтобы позволить двум моделям просмотра взаимодействовать, но ваш случай выглядит немного иначе, когда у вас есть представление (UserControl), говорящее с ViewModel.
Обратите внимание, что следующий ответ неверен. Кажется, что OneWayToSource обновляется только после изменения целевого свойства. Однако я не удаляю этот ответ, чтобы сообщить другим людям, которые не знают о таком поведении (например, я).
Старый ответ (см. текст выше)
IMO ваш пример должен работать (если MyControl.MyCommand является общедоступным свойством, которое возвращает ICommand). Вы пробовали BindingMode OneWayToSource
?
<local:MyControl
MyCommand="{Binding ViewModelsCommand,Mode=OneWayToSource}" />
OneWayToSource
не устанавливает источник при первоначальной привязке.
Похожие вопросы
Новые вопросы
wpf
Windows Presentation Foundation, или WPF, является подсистемой для визуализации пользовательских интерфейсов в приложениях на основе Windows.