5

Prism、MVVM パターン、および MEF を多用する Silverlight アプリケーションに取り組んでいます。いくつかの理由から、ビュー ファーストのアプローチに従うことにしました。

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

Button に Command と CommandParameter の両方を定義したいと思います。Command は、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>

誰かがそれを行うための最良の方法についてアドバイスしてもらえますか?

前もってありがとう、ジャンルカ。

4

4 に答える 4

12

現在のバインディングは を指してい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>
于 2011-07-05T13:47:35.947 に答える
2

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>

于 2011-07-05T13:34:18.667 に答える
1

Silverlight 5では、これを行うことができます

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

AncestorType を最上位の要素 (UserControl、ChildWindow など) に合わせて調整するだけです。

于 2012-10-09T20:13:44.350 に答える
0

多くの人がこれについて私を助けようとしました。有難うございます。残念ながら、提供された回答はほとんどが WPF に関連していました。

これが私が問題を解決した方法です:

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

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

情報が他の誰かに役立つことを願って、ここに投稿します。

乾杯、

ジャンルカ

于 2011-07-21T15:45:49.907 に答える