WPF: привязка к командам в коде позади - PullRequest
11 голосов
/ 17 июня 2010

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

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

следующим образом:

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

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

Так как же работает связывание команд в коде позади?

Ответы [ 4 ]

20 голосов
/ 15 октября 2014

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

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

SurfaceButton.SetBinding (Button.CommandProperty, new Binding("SaveReservationCommand"));
19 голосов
/ 17 июня 2010

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

SurfaceButton1.Command = SaveReservationCommand;
4 голосов
/ 12 сентября 2012

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

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

0 голосов
/ 14 мая 2019

Это работает

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