我在用户控件中有以下列表视图。我想在整行上双击。注册双击后,我想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));
}
}