Да, через привязку:
<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();
...
}