WPF: привязка к командам в коде

У меня есть приложение WPF Microsoft Surface, и я использую MVVM-Pattern.

У меня есть несколько кнопок, которые создаются в коде позади, и я хотел бы привязывать к ним команды, но я знаю только, как это работает в XAML

вот так:

<Custom:SurfaceButton Command="{Binding SaveReservationCommandBinding, Mode=OneWay}"/> 

Но я не могу этого сделать, потому что мои кнопки не существуют в XAML, только в коде.

Итак, как бы такая привязка команды срабатывала в коде?

Ответ 1

Предполагая, что у вас есть имя SurfaceButton для "SurfaceButton1", и у вас есть доступ к экземпляру команды, вы можете использовать следующий код:

SurfaceButton1.Command = SaveReservationCommand;

Ответ 2

Принятый ответ будет отлично работать, если Button имеет доступ к команде. Однако в MVVM они обычно сохраняются отдельно (кнопка в представлении и команда в представлении-модели). В XAML вы обычно используете привязку данных для ее подключения (например, пример в вопросе).

Моя программа дала мне ошибку, когда моя динамическая кнопка не могла найти команду (потому что она находилась в совершенно другом пространстве имен). Вот как я решил это решить:

SurfaceButton.SetBinding (Button.CommandProperty, new Binding("SaveReservationCommand"));

Ответ 3

Я взял код из ссылки, опубликованной Anvaka в качестве шаблона. Я использую RadMenuItem Telerik, но вы можете использовать любой другой компонент, который выдает свойство Command.

item = new RadMenuItem();
item.Header = "Hide Column";
DependencyProperty commProp = RadMenuItem.CommandProperty;
if (!BindingOperations.IsDataBound(item, commProp)) {
  Binding binding = new Binding("HideColumnCommand");
  BindingOperations.SetBinding(item, commProp, binding);
}
//this is optional, i found easier to pass the direct ref of the parameter instead of another binding (it would be a binding to ElementName).
item.CommandParameter = headerlCell.Column;
menu.Items.Add(item);

Надеюсь, это поможет... и если что-то непонятно, извините, это мой первый пост:)

Ответ 4

Это работает

Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl, AncestorLevel=1}, Path=SaveReservationCommand}"