2010-12-08 6 views
5

私はViewModelにオブジェクトとコマンドのコレクションを持っています。ItemsControl.ItemTemplateからModelプロパティを表示するためのバインド

コレクション内のオブジェクトごとにハイパーリンクを表示し、CommandParemeterとしてobjectIDを渡して、同じコマンドに各ハイパーリンクのCommandを設定します。例えば

私のUserControlのDataContextを上記のViewModelクラスに設定しました。次のようにこのユーザーコントロールのためのXAMLは次のとおりです。

<UserControl> 
    <ItemsControl ItemsSource="{Binding Path=MyList}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
     <StackPanel /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 

    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
     <HyperlinkButton Content="{Binding Path=Description}" Command="{Binding Path=MyCommand}" CommandParameter="{Binding Path=MyClassID}"/> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</UserControl> 

ハイパーリンクコンテンツの記述は、正しく表示が、コマンドは、私はそれがMyClassのオブジェクト内でコマンドを探しているので、これはあると思い、発射されることはありませんか?

私が探しているMyClass.MyCommandではなく、UserControls DataContext.MyCommandにどのようにバインドできますか?

答えて

6

残念ながら、WPFが持つRelativeSourceマークアップ拡張でFindAncestorモードを使用できないため、これは使用できません(これはSilverlight 5で追加されます)。それは面倒ですが、UserControl要素に名前を付け、ElementNameバインディングを使用してDataContextに割り当てられたオブジェクトのコマンドにバインドすることができます。例えば

<UserControl Name="root"> 

そして(ユーザーコントロールのデータコンテキストからドット表記法を使用して)コマンドをバインド:

Command="{Binding Path=DataContext.MyCommand, ElementName=root}" 

は試して与えます。

+0

クリス私はFerminと同じ問題があります。私はSL 5を使用していますが、RelativeSourceバインディングは機能しませんし、あなたの答えもありません。私は、DataContextにMyCommandという名前のプロパティがないため、あなたの答えがどのように機能するかわかりません。私のViewすなわちrootには、getterにViewModelというプロパティがあります。これはreturn(MyViewModel)DataContextです。それでも動作しません。 – Sam

+0

こんにちはSam、MyCommandは、Ferminが提供した例 - 自分のビューモデルに関するコマンドに関連しています。残念ながら、私はあなたの問題の詳細があなたを助けるほどにはありません。あなたは何をしようとしているのか、それをどうしようとしているのかという詳細と、新しい質問を始める方が良いでしょう。 –