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

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

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

нравится:

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

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

Итак, как такая привязка команд будет работать в коде?


person sofri    schedule 17.06.2010    source источник


Ответы (4)


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

SurfaceButton1.Command = SaveReservationCommand;
person decyclone    schedule 17.06.2010
comment
+1 за правильный ответ. Также при необходимости можно использовать Binding в коде (msdn.microsoft.com/ en-us/magazine/cc700358.aspx#id0190003) - person Anvaka; 17.06.2010
comment
Спасибо за быстрый ответ. Не думал, что это будет НАСТОЛЬКО легко ;) - person sofri; 17.06.2010
comment
Привязка может быть установлена ​​в коде позади, но реализация НЕ должна быть, и этот код будет работать, только если это так. - person David; 06.10.2016

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

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

SurfaceButton.SetBinding (Button.CommandProperty, new Binding("SaveReservationCommand"));
person Nightmare Games    schedule 14.10.2014
comment
item2.SetBinding(MenuItem.CommandProperty, новая привязка(LogoutCommand, источник: BindingContext)); Я не уверен, почему, но мой случай работает только в том случае, если я специально определяю источник - person chunyap; 04.10.2018

Я взял код из ссылки, опубликованной Анвакой, в качестве шаблона. Я использую 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);

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

person Zu1779    schedule 12.09.2012

Это работает

Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl, AncestorLevel=1}, Path=SaveReservationCommand}"
person Erhan Urun    schedule 14.05.2019
comment
Ты прав. Не знаю, почему я так ответил :) - person Erhan Urun; 22.07.2020