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 并尝试将您的绑定更改为类似于以下内容:

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