2010-09-01 3 views
0

Я мало нового для привязки команды, поэтому для многих это может быть тривиальным вопросом. Я знаю, что мы можем добавлять привязки команд в xaml окна и предоставлять его свойство соответствия в viewmodel. Эта viewmodel будет предоставлена ​​DataContext окна. Что-то вроде следующихдобавление пользовательского маршрутизируемого события пользовательского элемента управления в xaml окна в wpf

--app.xaml.cs

mainWindow.DataContext = viewModel;

- XAML

lt;Button Grid.Row="1" HorizontalAlignment="Right" Margin="0,3,18,3" Name="button1" Width="110" 
       Command="{Binding LoadCommand}">_Load</Button>

- ViewModel

/// <summary> 
     /// Gets the load command. 
     /// </summary> 
     /// <value>The load command.</value> 
     public ICommand LoadCommand 
     { 
      get 
      { 
       if (m_LoadCommand == null) 
       { 
        m_LoadCommand = new RelayCommand(param => CanLoad(), param => Load()); 
       } 

       return m_LoadCommand; 
      } 
     }

Здесь RelayCommand класс, который реализует Интерфейс ICommand. CanLoad() и Load() - это методы, которые будут выполняться для выполнения canececute и выполнения команды relaycommand соответственно. Это событие нажатия кнопки, которая обрабатывается.

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

//hook up event listeners on the actual UserControl instance 
      this.ucCustomEvent1.CustomClick += new RoutedEventHandler(ucCustomEvent_CustomClick); 
      //hook up event listeners on the main window (Window1) 
      this.AddHandler(UserControlThatCreatesEvent.CustomClickEvent, new RoutedEventHandler(ucCustomEvent_CustomClick));

Я не хочу, чтобы подключить RoutedEvent, явно в коде, но в XAML в Подобным же образом, как в примере кнопки. Я загрузил рабочий образец кода here для вашего прочтения.

ответ

2

Я не уверен, что полностью понимаю ваш вопрос, но, надеюсь, один из моих ответов ниже поможет вам.

Чтобы прикрепить «прямой» обработчик события в XAML, просто сделайте следующее:

<c:MyUserControl x:Name="uc1" CustomClick="uc1_CustomClickHandler"/> 

Чтобы подключить обработчик (маршрутизируемого) события одного элемента (например, событие CustomClick в вашем примере) к другому элементу (например, родительское окно):

<Window c:MyUserControl.CustomClick="ucCustomEvent_CustomClick"/> 

Теперь, если вы хотите, чтобы связать событие в вашем интерфейсе к командованию в вашей ViewModel, вы должны присоединенные поведения, чтобы сделать это. Существует множество фреймворков, в которых представлены различные реализации этого. Вот один из них вы можете попробовать: http://sachabarber.net/?p=514. Это позволит вам сделать что-то вроде следующего в вашем коде:

<c:MyUserControl local:CommandBehavior.RoutedEventName="MyCustomClick" 
        local:CommandBehavior.TheCommandToRun="{Binding MyViewModelCommand}"/> 

Надеюсь, это поможет.

+0

HI Karmi ваш последний код работал. Я действительно задавался вопросом, что это такое: CommandBehavior, но позже я узнал, что это класс. Еще один вопрос: как передать отправителя и RoutedEventArgs в свойство MyViewModelCommand? – samar

+0

Хммм ... это будет немного сложно и потребует некоторой настройки класса CommandBehavior в ссылке. Я бы сказал, что если вы используете шаблон MVVM, вероятно, не рекомендуется передавать отправителю и args в ViewModelCommand. Но в любом случае, чтобы это сделать, я подумал, что вам нужно будет изменить CommandBehavior и определить в нем еще одно вложенное свойство, например «CommandBehavior.PassEventInfo = true». – ASanch

Смежные вопросы