2012-02-03 6 views
1

私はMVVM WPF実装でListViewを持っていますが、内部にボタン付きのDataTemplateがあります。 ListViewは、ViewModelの複雑なオブジェクトのコレクションにバインドされています。ボタンコマンドをメンバーメソッドにどのようにバインドしますか?

<ListView ItemsSource="{Binding Path=ComplexObjects}" 
      SelectedItem="{Binding Path=SelectedObject}" 
      Width="Auto"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="My Property"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <StackPanel Margin="6,2,6,2"> 
          <TextBlock Text="{Binding MyProperty}"/> 
         </StackPanel> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
    </GridViewColumn> 
      <GridViewColumn Header="First Name"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <StackPanel Margin="6,2,6,2"> 
          <Button Command="{Binding ???}"/> 
         </StackPanel> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
    </GridView> 
</ListView.View> 

すべてのテキストフィールドには問題なくバインドされているが、私はComplexObjectのメンバーメソッドにボタンコマンドをバインドすることができますか?もしそうなら、パラメータを渡す方法はありますか?

私は恐らくICommandを使用して回避していると感じています。

ありがとうございました。

+0

@DJ KRAZE - 私はそれが役立つだろうかわからない - 私はにバインドするために探しています複雑なオブジェクトではなく、コードの背後にある。 – trickdev

+1

ここに役立つかもしれない何か私は正しく理解していますので、本当にBindingをサポートしていないので、このサイトはhttp://connect.microsoft.com/VisualStudio/feedback/details/472932/wpf-commandparameter- binding-should-be-evaluate-before-コマンドバインディング|ここにStackOverFlowの同様のポストがあります。これは3つのオプションも提供します。http://connect.microsoft。com/VisualStudio/feedback/details/472932/wpf-command-parameter-binding-should-be-be-be-before-command-binding- – MethodMan

+0

@DJ KRAZEありがとうございます。 – trickdev

答えて

5

ICommandをViewModelにバインドし、インスタンスを渡してメソッドをパラメータとして呼び出すことができます。 ViewModelは、右の適切なメソッドを呼び出すことができますComplexObject。例えば

<DataTemplate> 
    <StackPanel Margin="6,2,6,2"> 
     <Button Command="{Binding DoSomethingCommand, RelativeSource={RelativeSource AncestorType={x:Type ViewModelType}, Mode=FindAncestor}" CommandParameter="{Binding}"/> 
    </StackPanel> 
</DataTemplate> 

その後のviewmodelはそうのようになります。

public ICommand DoSomethingCommand 
{ 
    get { return new DelegateCommand<object>(DoSomething); } 
} 

private void DoSomething(object instance) 
{ 
    var complexObject = instance as ComplexObject; 
    if (complexObject != null) 
     complexObject.SomeMethod(); 
} 
+0

答えと同様、この時点でバインディングを取得することができません – trickdev

+0

それを入手しましたが、RelativeSourceを使用していません。{Binding ElementName = nameOfListView、 Path = DataContext.DoSomethingCommand} – trickdev

+0

回答はDelegateCommandの説明を使用することもできますが、前に使用していましたが、他のものは持っていない可能性があります。ありがとう! – trickdev

2

あなたが本当に夢中になりたいのであれば、あなた自身のボタンカスタムコントロールをdelegateという依存関係プロパティで作ることができ、同じタイプのdelegateを返すプロパティにバインドできます。カスタムコントロールクラスでは、クリックしたときにデリゲートを呼び出すことができます。


は、あなたがそのルートを行けば、これはどのように...

<Button Command={Binding CommandProperty} /> 

使用ケントBoogaartのDelegateCommandクラスの彼blog postからで、常に標準のICommandがあります。あなたのメソッドがある場合

<Button Command="{Binding Path = CommandName}"/> 

: その後...にあなたが結合しているクラスで

private ICommand _commandField; 

public ICommand CommandProperty 
{ 
    get 
    { 
    if (_commandField == null) _commandField = new DelegateCommand(CommandMethod); 

    return _commandField; 
    } 
} 

private void CommandMethod() 
{ 
    // do stuff... 
} 
+1

私はaskerが 'ICommand'それぞれの 'ComplexObject'にあり、メソッドを直接呼び出す方法を探しています。 – Lukazoid

+0

Hmmm、それが可能かどうかはわかりませんが、私は答えを編集します... – KurToMe

0

はい]ボタンのために、あなたのComplexObjectに設立されたのICommandを使用する必要があります複雑なオブジェクトコレクションの名前を持つビューモデルでコントロールまたはウィンドウの名前をMeとし、次のようなものを使用します。

<Button Command="{Binding ElementName=Me, Path=DataContext.CommandName}" /> 

マウスをクリックまたはプレビューすることはできますが、XAMLでメソッドをバインドする場合は、そのイベントをコマンドにルーティングする必要があります。コマンドをバインドする方が簡単です。

関連する問題