2016-07-19 4 views
0

Я использую Wpf, и я передаю List<Value> в <ItemsControl> в xaml. Я хотел бы привязать string к объекту Value к команде кнопки. Это XAML часть выглядит следующим образом:Команда кнопки DataTemplate из привязки

<Grid Margin="0,0,2,0"> 
    <Grid Margin="10"> 
     <ItemsControl Name="details"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <Grid Margin="0,0,0,5"> 
         <Grid.ColumnDefinitions> 
          .... 
         </Grid.ColumnDefinitions> 
         ... 
         <Button Grid.Column="2" 
           Content="{Binding ButtonContent}" 
           Visibility="{Binding ButtonVisibility}" 
           Command="{Binding ButtonClickMethod}" /> 
     ... 

Мой Value класс выглядит следующим образом:

public class Value 
{   
    ... 
    public string ButtonClickMethod { get; set; } 

} 

Я устанавливающее связь строки это:

v.ButtonClickMethod = "RelatedActivityId_OnClick"; 

и метод в такой же класс и выглядит следующим образом:

private void RelatedActivityId_OnClick(object sender, RoutedEventArgs e) 
    { 
     MessageBox.Show("RelatedActivityId_OnClick"); 
    } 

Все, кроме этого, работает исправно и разделяет тот же объект для привязки. Что я делаю неправильно?

+0

Значит, строка 'ButtonClickMethod' содержит имя метода для выполнения? –

+0

Да Я только что добавил еще код – CoookieMonster

ответ

1

Недвижимость Button имеет тип ICommand, поэтому вы не можете привязать ее к значению string.

Вам необходимо обновить свой ButtonClickMethod до типа ICommand или создать новое свойство, чтобы связать вас Command.

См. this Ответ на образец реализации ICommand.

Если вам нужна кнопка для выполнения кода на основе параметра (строковое значение?), Вы можете использовать свойство CommandParameter, а затем использовать эти параметры в своем командном обработчике.

public class Value 
{   
    public Value() 
    { 
     ButtonCommand = new RelayCommand((a) => true, CommandMethod); 
    } 

    public RelayCommand ButtonCommand {get; set; } 
    public string ButtonClickMethod { get; set; } 

    private void CommandMethod(object obj) 
    { 
     MessageBox.Show(obj?.ToString()); 
    } 
} 

и XAML:

<Button Grid.Column="2" 
     Content="{Binding ButtonContent}" 
     Visibility="{Binding ButtonVisibility}" 
     Command="{Binding ButtonCommand}" 
     CommandParameter="{Binding ButtonClickMethod}" /> 
+1

(Если целью является выполнение на основе динамически заданного значения, то просто назначение другой команды проще, чем использование строк и отражений в любом случае.) –

+0

Я надеюсь, что он может использовать параметр, чтобы решить, какой метод вызывать, а не находить его, хотя отражение ... при условии, что существует определенное количество методов, к которым он может обратиться. – AlexDrenea

1

Свойство Button.Command связывается только с объектами, которые реализуют интерфейс ICommand. Если вы хотите вызвать метод, который его зовут ButtonClickMethod, вы должны:

  1. Создать класс, который реализует интерфейс ICommand.
  2. Создайте объект этого класса и привяжите его к своей кнопке (привяжите его к Button.Command).
  3. Передайте значение Value.ButtonClickMethod в качестве параметра CommandParameter для вашего объекта ICommand.
  4. Используйте это, чтобы вызывать любой метод, который вам нужен.