2

ユーザーコントロールに次のリストビューがあります。行全体にダブルクリックを登録したいと思います。ICommandダブルクリックが登録されたら、ビュー モデルで呼び出したいと思います。

誰も私がこれを行う方法を知っていますか?

これに関する他の投稿があることを知っており、それらにある解決策を試しました (MVVM Light と AttachedCommandBehavior の両方を使用) が、ダブルクリックが単に登録されていないか、TVSeries私のモデルであるオブジェクトでICommand を呼び出そうとします。行に表示されるデータを保持します。

これは私のリストビューです:

<ListView Height="456"
          HorizontalAlignment="Left"
          Margin="12,12,0,0" 
          VerticalAlignment="Top"
          Width="488"
          ItemsSource="{Binding Path=Library}"
          SelectedItem="{Binding Path=SelectedTVSeries}">

    <ListView.View>

        <GridView>

            <GridViewColumn Header="Name"
                            Width="Auto">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=Name}"
                                   FontWeight="Bold" />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>

            <GridViewColumn Header="Year"
                            Width="Auto">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=Year}" />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>

            <GridViewColumn Header="Genre"
                            Width="Auto">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=Genre}" />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>

        </GridView>

    </ListView.View>

</ListView>

アップデート

AttachedCommandBehaviorを使用すると、次のエラーが発生します。

NullReferenceException は処理されませんでした

オブジェクト参照がオブジェクト インスタンスに設定されていません。

エラーは次の行で発生します (AttachedCommandBehavior の一部です)。

/// <summary>
/// Executes the strategy
/// </summary>
public void Execute()
{
   strategy.Execute(CommandParameter);
}

私は以下のようにACBを使用しています。まず、ListViewItem のスタイルを宣言します。

<-- 言語: xml -->

<UserControl.Resources>
    <Style x:Key="LibraryListViewItemStyle"
           TargetType="{x:Type ListViewItem}">
        <Setter Property="acb:CommandBehavior.Event" Value="MouseDoubleClick" />
        <Setter Property="acb:CommandBehavior.Action" Value="{Binding RelativeSource={RelativeSource AncestorType=ListView}, Path=DataContext.TVSeriesDoubleClickedCommand}" />
        <Setter Property="acb:CommandBehavior.CommandParameter" Value="{Binding }" />
    </Style>
</UserControl.Resources>

次にItemContainerStyle、リスト ビューをスタイルに設定します。

<ListView Height="456"
          HorizontalAlignment="Left"
          Margin="12,12,0,0" 
          VerticalAlignment="Top"
          Width="488"
          ItemsSource="{Binding Path=Library}"
          SelectedItem="{Binding Path=SelectedTVSeries}"
          ItemContainerStyle="{StaticResource LibraryListViewItemStyle}">

...

</ListView>

これを修正する方法を知っている人はいますか?これは本当に私が行った中で最も近いものです。

** 更新: 解決策**

アクションを期待するように AttachedCommandBehavior を構成しましたが、コマンドを実装したため、上記のエラーが発生しました。以下からの変更

<Setter Property="acb:CommandBehavior.Action" Value="{Binding RelativeSource={RelativeSource AncestorType=ListView}, Path=DataContext.TVSeriesDoubleClickedCommand}" />

以下へ

<Setter Property="acb:CommandBehavior.Command" Value="{Binding RelativeSource={RelativeSource AncestorType=ListView}, Path=DataContext.TVSeriesDoubleClickedAction}" />

それはエラーを解決しました。

ただし、アクションを使用する方が好きであることがわかったのでacb:CommandBehavior.Action、実装を維持して変更しました。

public Action<object> TVSeriesDoubleClickedAction
{
    get
    {
        return new Action<object>(tvSeries => Console.WriteLine("*** Double clicked fired: {0}", ((TVSeries)tvSeries).Name));
    }
}
4

1 に答える 1

0

または、モデルであり、行に表示されるデータを保持する TVSeries オブジェクトで ICommand を呼び出そうとします。

これは、ICommand へのバインディングが正しく設定されていないために発生します。TVSeries オブジェクトで ICommand を呼び出していた場所で試したソリューションの 1 つに戻り、バインディングを次のようなものに変更することをお勧めします。

Binding="{Binding RelativeSource={RelativeSource AncestorType=ListView}, Path=DataContext.YourCommandName}"
于 2012-10-26T13:03:23.060 に答える