2016-07-19 4 views
0

私はWpfを使用していますが、List<Value>をxamlの<ItemsControl>に渡しています。 Valueオブジェクトのstringをボタンのコマンドにバインドしたいと思います。この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

ボタンのCommandプロパティはICommandなので、stringの値にバインドすることはできません。

ButtonClickMethodをICommandタイプに更新するか、新しいプロパティを作成してCommandにバインドする必要があります。

ICommandの実装例については、this答えを参照してください。

パラメータ(文字列値?)に基づいてコードを実行するボタンが必要な場合は、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. これを使用して、任意の方法を呼び出すことができます。
関連する問題