Взаимодействие кнопок в шаблоне столбца DataGrid - PullRequest
1 голос
/ 17 февраля 2012

В программе C # WPF у меня есть таблица, которую я успешно заполнил своими данными. В одном столбце есть кнопка, которую я хочу связать со страницей редактирования. Код ниже.

var col = new DataGridTemplateColumn();
col.Header = "Edit";
var template = new DataTemplate();
var textBlockFactory = new FrameworkElementFactory(typeof(Button));
textBlockFactory.SetBinding(Button.ContentProperty, new System.Windows.Data.Binding("rumId"));
textBlockFactory.SetBinding(Button.NameProperty, new System.Windows.Data.Binding("rumId"));
textBlockFactory.AddHandler( Button.ClickEvent, new RoutedEventHandler((o, e) => System.Windows.MessageBox.Show("TEST")));
template.VisualTree = textBlockFactory;
col.CellTemplate = template;
template = new System.Windows.DataTemplate();
var comboBoxFactory = new FrameworkElementFactory(typeof(Button));
template.VisualTree = comboBoxFactory;
col.CellEditingTemplate = template;
dgData.Columns.Add(col);

Код успешно выполняется, и я получаю окно сообщения каждый раз, когда выбираю кнопку.

Как я могу заставить это вызвать другой метод и затем извлечь из этого номер строки кнопки, которую я выбрал?

Следующий метод будет выглядеть примерно так: как я могу его назвать?

void ButtonClick(object sender, MouseButtonEventArgs e)
{
MessageBox.Show("hi Edit Click 1");
// get the data from the row
string s = myRumList.getRumById(rumid).getNotes();
// do something with s
}

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

Просто свяжите Id, а еще лучше весь объект данных, как CommandParameter

void ButtonClick(object sender, MouseButtonEventArgs e)
{
    MessageBox.Show("hi Edit Click 1");

    Button b = sender as Button;

    // Get either the ID of the record, or the actual record to edit 
    // from b.CommandParameter and do something with it
}

Это также будет работать, если вы решите переключить свое приложение, чтобы оно использовало шаблон проектирования MVVM. Например, XAML будет выглядеть так:

<Button Command="{Binding EditCommand}"
        CommandParameter="{Binding }" />
0 голосов
/ 17 февраля 2012

Что я понимаю, так это то, что вам нужно иметь rumId кликнувшего текстового блока, чтобы отредактировать его.

При настройке события Click вы можете сделать следующее.

textBlockFactory.AddHandler( Button.ClickEvent, 
     new RoutedEventHandler((o, e) => 
      {
         var thisTextBlock = (TextBlock) o; // casting the sender as TextBlock 
         var rumID = int.Parse(thisTextBlock.Name); // since you bind the name of the text block to rumID
         Edit(rumID); // this method where you can do the editting 
      })); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...