Привязать событие родительского окна к внутренним обработчикам UserControl с помощью MVVM - PullRequest
1 голос
/ 08 июля 2011

У меня есть родительское окно, которое загружает пользовательский контроль внутри ContentControl.В родительском окне есть панель инструментов с некоторыми кнопками (например, кнопка «Сохранить»).Я хотел бы назначить те команды кнопок, которые будут обрабатываться в пользовательском контроле.

Мне нужно управлять своими собственными командами ICommand из ViewModel usercontrol, чтобы подвести итог: пользователь нажимает кнопку «Сохранить» (в главном окне), чтобы кнопка запускала событие, которое обрабатывает userControl для сохраненияинформация в элементе управления.

Возможно ли это?

Ответы [ 4 ]

2 голосов
/ 08 июля 2011

Есть два способа сделать это.

  1. Используя MVVM,
    Поскольку ваше окно содержит UserControl, вам необходимо настроить так, чтобы Window имел ссылку на UserControl ViewModel (предположим, что он называется UserControlViewModel).Если у вас есть команда в UserControlViewModel, вы можете привязать эту команду, вызвав: UserControlViewModel.Command что-то вроде:

    <Button x:Name="Save" Content="Save" Command="{Binding UserControlViewModel.SaveCommand}">
    
  2. Использовать обработчик событий

    Опять же, ваше окно должно иметь ссылку на класс, в котором реализован обработчик событий.в вашем файле Window XAML может быть следующее:

        <Button x:Name="Save" Content="Save" Clicked="SaveButtonClicked"/>
    

    Затем в вашем коде,

             private void SaveButtonClicked( .... sender, .... e)
              {
                   UserControlClass.SaveData();
                    // or using command
                   UserControlClass.MyCommand.Execute()
               }
    
1 голос
/ 08 июля 2011

ОК, вы пытаетесь привязать команду дочернего элемента к родительскому окну. Сначала дайте имя usercontrol (например, x: Name = MyUserControl) и напишите открытую команду в datacontext / viewmodel usercontrol (например, ICommand MyCommand). Теперь в кнопке сделать это

<Button x:Name="SaveButton" Command={Binding ElementName=MyUserControl, Path=DataContext.MyCommand} />

Это свяжет команду кнопок сохранения с командой внутри datacontext дочернего usercontrol:)

Кстати, если вы ищете другой способ (то есть связывание дочерней команды с родителем в mvvm), вам нужно будет использовать FindAncestor. Вы можете ознакомиться с моей статьей codeproject по этому поводу:)

0 голосов
/ 24 августа 2011

Ну, через некоторое время я возвращаюсь к этому вопросу.Мне нужно было связаться с моим родительским окном, поэтому я решил выполнить привязку datacontext view-viewmodel прямо из родительского окна, главным образом потому, что я хочу, чтобы дочерняя viewmodel прикреплялась к событиям, запущенным из его родителя, а также я могу запускать события для родителяЧтобы показать сообщения за пределами дочернего контроля.

Я знаю, что, возможно, я не использую шаблон MVVM полностью, но я хотел иметь больший контроль над этими функциями.

0 голосов
/ 08 июля 2011

Это звучит как случай, когда маршрутизируемые команды могут работать. Для перенаправленной команды установите «Команду» на кнопке платного вызова «Сохранить». Затем в пользовательский элемент управления добавьте привязку команды, которая прослушивает команду «save».

<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <UserControl.CommandBindings>
    <CommandBinding 
      Command="Save" 
      CanExecute="SaveCommand_CanExecute" 
      Executed="SaveCommand_Executed" 
    />
  </UserControl.CommandBindings>

</UserControl>

В обработчиках событий выделенного кода для привязки команды просто найдите viewmodel и вызовите команду save для ее viewmodel. Если вы хотите более пуристический подход MVVM, вы можете попробовать подход Джоша Смита к маршрутизируемым командам с MVVM .

При использовании этого подхода, если пользовательский элемент управления находится в фокусе где-то внутри него, команда сохранения кнопки сохранения будет перенаправлена ​​на привязку команды пользовательского элемента управления и выполнит команду сохранения.

Я думаю, что это может помочь вам отделить кнопку панели инструментов от динамически загружаемого пользовательского элемента управления в ContentPresenter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...