Обработка команд в составном модуле WPF без фреймворка - PullRequest
1 голос
/ 16 марта 2011

Я делаю модуль в приложении, где мне нужно создать сложный интерфейс. Я решил использовать пользовательские элементы управления для пользовательского интерфейса из-за сложности.

Из-за сложной природы этого я сталкиваюсь с некоторыми проблемами. Существует usercontrol, который может содержать другой пользовательский элемент управления.

<MainWindow>

  <UserSelectionUserControl>
     <Button Command="SelectFirstChild/>
     <Button Command="SelectSecondChild/>
     <Button Command="SelectThirdChild/>
  </UserSelectionUserControl>


   <MainUserControl>
      <ChildUserControl/>
   </MainUserControl>

</MainWindow>

Существует несколько ChildUserControls. Во время выполнения я должен прикрепить ChildUserControl в MainUserControl в соответствии с нажатием кнопки пользователя.

Моя проблема в том, как эффективно сделать обмен сообщениями? Я не могу использовать аггрегирование событий / единство, потому что я просто делаю модуль в большом приложении. Я мог бы использовать RoutedCommand, но можно ли передать параметры с помощью команды. Например, все кнопки будут запускать одну и ту же команду с некоторым строковым значением, которое однозначно идентифицирует нажатую кнопку?

1 Ответ

1 голос
/ 16 марта 2011

Да, вы можете использовать параметры с командой. В объявлении UserControls используйте свойство CommandParameter для привязки или определения данных, которые вы хотите отправить в команду. в объявлении вашей команды должен быть указан объект, передаваемый по значению.

<Button Content="Browse" Command="{Binding BrowseCommand}" CommandParameter="Image"/>

-ИЛИ-

<Button Content="Browse" Command="{Binding BrowseCommand}" CommandParameter="{Binding SelectedItem, ElementName=listBox}"/>

В приложении, где я пытаюсь ограничить использование каркаса, я использую MVVMFoundation , и мои свойства и методы команд выглядят так:

 Private _cmdBrowseCommand As ICommand
Public ReadOnly Property BrowseCommand() As ICommand
    Get
        If _cmdBrowseCommand Is Nothing Then
            _cmdBrowseCommand = New RelayCommand(Of Object)(AddressOf BrowseExecute)
        End If
        Return _cmdBrowseCommand
    End Get

End Property

Private Sub BrowseExecute(ByVal param As Object)
    If TypeOf(param) is PannableImage Then
        'Code removed for brevity
    End If
End Sub
...