2011-02-10 6 views
4

MVVMライトコマンドを使用してボタンをviewmodelコマンドにバインドしようとしていますが、何らかの理由でコマンドが呼び出されていないようです。通常、私はコマンドを使って何の問題もありませんが、これはバインディングを無視しているようです。Windows Phone 7アイテムデータテンプレート内のMVVMライトリレーコマンドへのバインド

<ListBox.ItemTemplate> 
    <DataTemplate> 
     <StackPanel> 
      <Button> 
       <Interactivity:Interaction.Triggers> 
        <Interactivity:EventTrigger EventName="Click"> 
         <Command:EventToCommand 
          Command="{Binding MyButtonClickAction}" /> 
        </Interactivity:EventTrigger> 
       </Interactivity:Interaction.Triggers> 
      </Button> 

      <StackPanel> 
       <TextBlock Text="{Binding MyProperty}"/> 
       <StackPanel Orientation="Horizontal"> 
        <TextBlock Text="{Binding MyOtherProperty}" /> 
       </StackPanel> 
      </StackPanel> 
     </StackPanel> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

このデータテンプレートは、私のアプリが起動した後に作成されたリストであり、そしてそれが問題だ場合、私は思ったんだけど:

は、ここに私のコードです。私の理論では、ビューモデルが作成され、コンストラクタはrelayコマンドでバインディングを設定しようとしますが、リストにはまだ項目がないため、バインディングは何とか失敗します。

MYPROPERTYとMyOtherPropertyへのバインディングが正常に動作します。

私はこの作業を取得する方法をするなど任意の提案ですか?

+0

おかげ -

xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.WP7" 

あなたのボタンXAMLは、このようになります。 –

答えて

7

問題はDataTemplateを内部で、DataContextのは項目自体ではなく、あなたのViewModelにあるということです。あなたが{Binding MyButtonActionClick}を言うときに、結合は、私は推測している項目、上MyButtonActionClickと呼ばれるコマンドを探しているだけのシンプルなオブジェクトであり、独自のコマンド性質を持っていません。

これを回避するには、いくつかの方法があります。すでにMMVM Lightを使用しているので、List<Foo>ではなく、コレクションをList<FooViewModel>と定義し、独自のViewModelクラスでアイテムをラップするのが最良の方法です。次に、MyButtonActionClickコマンドをそのViewModelに追加し、コールを親ViewModelに戻すことができます。

それはItemsControlに自身のDataContextのを見てそれ以外の場合は、結合あなたのコマンドを変更します。それを行う方法に関するいくつかのアイデアについては、this question(そして受け入れられた答え、もちろん)を見てください。サイドノートとして

+0

それは完璧な意味合いがあります。私は別のビューモデルを選ぶつもりだと思っています。ありがとう! –

+6

MVVM Lightでは、ViewModelLocatorでVMを見つけることもできます。私はそれを個人的に好む。バインディングは{Binding Source = {StaticResource Locator}、Path = Main.MyCommand}になります。MainはMyCommandをホストするVMです – LBugnion

+0

本当にうまくいった、Laurent。私は助けに感謝します。 –

7

、あなたはボタンでコマンドを関連付けるときButtonBaseExtensionsクラスを使用して検討する必要があります。このクラスは、GalaSoft.MvvmLight.WP7アセンブリのGalaSoft.MvvmLight.Command名前空間にあります。

あなたの名前空間XAMLは、含まれます: - :フォーマット、マットを固定する

<Button cmd:ButtonBaseExtensions.Command="{Binding MyButtonClickAction}"/> 
+0

うわー - あなたがこれを行うことができるとは考えていませんでした。これは私のXAMLファイルをかなり下にカットします - ありがとう! –