2011-07-05 18 views
3

私は、Prism、MVVMパターン、およびMEFを幅広く使用するSilverlightアプリケーションを開発しています。いくつかの理由から、私はビューファーストアプローチに従うことを選択しました。DataGridTemplateColumn内のコマンドバインディング

ビューの1つにはDataGridがあり、このグリッドの列の1つはDataGridTemplateColumnであり、ボタンは1つだけです。

ボタンにCommandとCommandParameterの両方を定義したいと思います。コマンドは、ViewModelのDelegateCommandでなければなりません。 CommandParameterは、DataGridからまっすぐに来るSelectedItemsリストでなければなりません。

これを行うにはいくつかの方法を試しましたが、CommandまたはCommandParameterのいずれかがnullです。

それは私が最初に書いたコードを、次のとおりです。

<sdk:DataGridTemplateColumn> 
    <sdk:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <Button Width="15" Height="15" Content=">" 
        Command="{Binding UpdateSearchParametersCommand}" 
        CommandParameter="{Binding SelectedItems, ElementName=dataGrid}"> 
     </DataTemplate> 
    </sdk:DataGridTemplateColumn.CellTemplate> 
</sdk:DataGridTemplateColumn> 

誰かがそれについて移動する最良の方法は何であるかに私をアドバイスもらえますか?

ありがとうございます。 ジャンルルカ。

答えて

0

を指すように変更する必要があります。有難うございます。 残念なことに、提供された回答は主にWPFに関連していました。ここで

が、私は問題を解決してきた方法です:

<helpers:BindingHelper.Binding> 
<helpers:BindingList> 
    <helpers:RelativeSourceBinding TargetProperty="Command" Path="DataContext.ToggleDataArchiveInheritanceCommand" RelativeMode="FindAncestor" AncestorType="ChildWindow" /> 
</helpers:BindingList> 
</helpers:BindingHelper.Binding> 

[OK]を、これは、同じアプリケーションの別のポイントから来ているが、原理は同じです。 a内にバインディングが定義されている場合、Silverlightで(DataTemplateの一部ではないため)通常はスコープ外の他の要素に到達する唯一の方法は、xamlオブジェクトツリーを調べることです。これがBindingHelperの機能です。

ここに投稿すると、情報が他の誰かに役立つことが期待されます。あなたがちょうどあなたのトップレベルの要素は、(ユーザーコントロール、ChildWindowなど)であるものは何でもするAncestorTypeを調整し、この

<Button Command="{Binding Path=DataContext.PreviewPublishCommand, RelativeSource={RelativeSource AncestorType=controls:ChildWindow}}" Content="Publish" /> 

を行うことができますシルバー5では

乾杯、

Gianlucaさん

+0

Ciao Gianlucaさん、これを投稿しています...私はこの同じことをやろうとしていますが、 "BindingHelper"が何であるかはわかりません。これと一緒に行くコードが増えていますか、またはSilverlightで何かBindingHelperですか? –

+0

こんにちは。あなたは正しいですが、私はこれまでの言葉でこの同じ記事で説明した、かなり単純なコードがあります。私は、自分が作成したヘルパークラスをコピー&ペーストするために、2011年に作業していたソースコードを探す必要があります。今は歓声。 g。 –

+0

ここにソースがあります:http://snipt.org/ujph9 –

1

ItemsSourceを使用してDataGridをバインドすると、CommandおよびCommandParameterバインディングは、現在のアイテムに関連付けられています。

この場合、代替ソースを使用する必要があります。コマンドは、DataContext.UpdateSearchParametersCommandとCommandParameter - DataContext.SelectedItemsにバインドする必要があります。

あなたのケースでは、UpdateSearchParametersCommandもSelectedItemsもバインドされたアイテムに見つかりません。

は、先祖のために右のタイプを設定してください

を更新しました。私はそれをウィンドウに設定しましたが、UserControlを使用している可能性があります。

<sdk:DataGridTemplateColumn> 
<sdk:DataGridTemplateColumn.CellTemplate> 
    <DataTemplate> 
     <Button Width="15" Height="15" Content=">" 
       Command="{Binding Path=DataContext.UpdateSearchParametersCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" 
       CommandParameter="{Binding Path=DataContext.SelectedItems, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"> 
    </DataTemplate> 
</sdk:DataGridTemplateColumn.CellTemplate> 

+0

この回答を改善するには、ボタンに含めるべきxamlを含めます。 – AnthonyWJones

+0

@AnthonyWJonesそうです。 – 26071986

+0

@ 26071986:ありがとうございます。しかし、あなたの解決策では、Window型の祖先を探していることに気付きました。私は完全に間違っているかもしれませんが、私が知っている限り、それはSilverlightでサポートされていません。それが正しいか? –

6

あなたの現在のバインディングはDataGridRowItem.UpdateSearchParametersCommandを指しています。あなたはあなたの多くは、この上で私を助けようとしたDataGrid.DataContext.UpdateSearchParametersCommand

<sdk:DataGrid x:Name=dataGrid> 
    <sdk:DataGridTemplateColumn> 
     <sdk:DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
       <Button Width="15" Height="15" Content=">" 
         Command="{Binding DataContext.UpdateSearchParametersCommand, ElementName=dataGrid}" 
         CommandParameter="{Binding SelectedItems, ElementName=dataGrid}"> 
      </DataTemplate> 
     </sdk:DataGridTemplateColumn.CellTemplate> 
    </sdk:DataGridTemplateColumn> 
</sdk:DataGrid> 
1

関連する問題