WPF Commands - как использовать в пользовательском управлении - PullRequest
3 голосов
/ 27 октября 2011

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

В настоящий момент в моем главном окне определены следующие команды.Они потребляются элементами ToolBar, а также пунктами меню ...

<Window.CommandBindings>
    <CommandBinding Command="Close" Executed="CloseCommandHandler" />
    <CommandBinding Command="local:AppCommands.OpenAttributes" Executed="OpenAttributesHandler" CanExecute="OpenAttributesCanExecute" />
</Window.CommandBindings>

Можно ли использовать эти же команды из пользовательского элемента управления, вложенного в мое главное окно?

Ответы [ 2 ]

3 голосов
/ 27 октября 2011

Да, через привязку:

<Button Command="{Binding MyCommand}" />

Если это пользовательский элемент управления, просто предоставьте ему свойство зависимости типа ICommand.Кроме того, MyCommand должен быть внутри ViewModel.

РЕДАКТИРОВАТЬ:
Скажем, у вас есть Button, вложенный в ваш UserControl:

<UserControl x:Name="MyUc">
...
   <Button Command={Binding NestedCommand, ElementName=MyUc} />
...
</UserControl>

В кодепозади пользовательского элемента управления вам нужно представить «NestedCommand» как свойство зависимости:

#region NestedCommand
    public ICommand NestedCommand
    {
        get { return (ICommand)GetValue(NestedCommandProperty); }
        set { SetValue(NestedCommandProperty, value); }
    }

    // Using a DependencyProperty as the backing store for NestedCommand.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty NestedCommandProperty =
        DependencyProperty.Register("NestedCommand", typeof(ICommand), typeof(MyUserControlClassName), new UIPropertyMetadata(MyDefaultValue));
    #endregion

Установите для «MyDefaultValue» значение null, а для «MyUserControlClassName» - имя вашего UserControl, давайте назовем его Bob дляминута.

Теперь, когда вы будете использовать этот UserControl, он предоставит свойство NestedCommand:

<Window>
...
<my:Bob NestedCommand="{Binding MyCommand}" />
...
</Window>

"my" - это пространство имен xmlns, где, конечно, определены ваши UserControls.
И MyCommand должен быть определен в вашей ViewModel, также как объект, который вы поместили как DataContext своего представления.
Вы можете узнать об этом по всему Интернету, но все сводится к созданию класса, который реализует INotifyPropertyChanged, добавляяICommand к нему, а затем в конструкторе окна:

public MyWindow()
{
...
   this.DataContext = new MyViewModel();
...
}
0 голосов
/ 27 октября 2011

Да, вы можете.Вы должны сделать привязку команды в вашем пользовательском элементе управления этой командой.

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