Я не согласен с таким подходом, но я отвечу на вопрос.
Вам потребуется создать объект Binding
, а затем использовать BindingOperations
, чтобы применить привязку. Я привожу пример в коде ниже с комментариями.
Обычно Commands
не требует обязательной привязки, а CommandParameters
часто это делают. Итак, я приведу краткий пример, который я собрал, который, надеюсь, даст вам достаточно информации для добавления любой необходимой привязки, включая Command
, если вы хотите. Если Command
никогда не меняется, я настоятельно рекомендую просто установить его; что аналогично установке Binding
с Mode = OneTime
.
Этот пример предназначен ТОЛЬКО для того, чтобы показать, как выполнить привязку в коде; ничего больше. Если у вас есть StackPanel
(или любая панель) в вашем MainWindow
с именем root, вы можете скопировать и вставить этот код, чтобы поиграть с ним. (Добавьте необходимые операторы также)
Здесь я предоставляю простой PersonViewModel
, создаю список этих людей (людей), а затем привязываюсь к списку, добавляя ТОЛЬКО * CommandParameterBinding
для этого примера.
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Initialize();
}
public void Initialize()
{
var ids = 0;
var people = new List<PersonViewModel>()
{
new PersonViewModel() { Id = ids++, Name = "Mathew"},
new PersonViewModel() { Id = ids++, Name = "Mark"},
new PersonViewModel() { Id = ids++, Name = "Luke"},
new PersonViewModel() { Id = ids++, Name = "John"}
};
foreach (var person in people)
{
var button = new Button()
{
Content = person.Name,
Command = person.UpdatePersonCommand
};
SetCommandParameterBinding(button, person);
button.Click += (s, e) => MessageBox.Show(button.CommandParameter.ToString());
root.Children.Add(button);
}
}
//This is the method that answers your question
private static BindingExpressionBase SetCommandParameterBinding(ButtonBase button, PersonViewModel person)
{
//This sets a binding that binds the 'Name' property in PersonViewModel
//Leave constructor parameter emtpy to bind to the object itself i.e. new Binding() { Source = Person }; will bind to person
var binding = new Binding(nameof(PersonViewModel.Name)) { Source = person };
//This sets the binding to the button and button CommandParameterProperty
var bindingExpression = BindingOperations.SetBinding(button, ButtonBase.CommandParameterProperty, binding);
return bindingExpression;
}
}
//This isn't a fully written ViewModel obviously. It's just here to make this example work. INotifyPropertyChanged is not completely implemented. It also definitely doesn't belong in this namespace.
public class PersonViewModel : INotifyPropertyChanged
{
public string Name { get; set; }
public int Id { get; set; }
public ICommand UpdatePersonCommand { get; }
public event PropertyChangedEventHandler PropertyChanged;
}