WPF通过AttachedCommandBehavior列出ViewItem多个事件
本文关键字:事件 ViewItem 列出 通过 AttachedCommandBehavior WPF | 更新日期: 2023-09-27 18:19:41
我正在尝试使用AttachedCommandBehaviours将ListViewItem的两个事件传递给我的ViewModel。
这是我的风格:
<Style x:Key="MouseDoubleClickStyle" TargetType="{x:Type ListViewItem}" BasedOn="{StaticResource {x:Type ListViewItem}}">
<Setter Property="attachedCommandBehavior:CommandBehavior.Event"
Value="MouseDoubleClick" />
<Setter Property="attachedCommandBehavior:CommandBehavior.Command"
Value="{Binding ElementName=ServerListView, Path=DataContext.ListViewItemDoubleClickedCommand}" />
<Setter Property="attachedCommandBehavior:CommandBehavior.CommandParameter"
Value="{Binding}" />
</Style>
这是我的ListView:
<ListView x:Name="ServerListView" Height="200" ItemsSource="{Binding Servers, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" ItemContainerStyle="{StaticResource MouseDoubleClickStyle}">
<ListView.View>
<GridView>
<GridViewColumn Header="Dienstname" DisplayMemberBinding="{Binding ServiceName}" />
<GridViewColumn Header="Servername" DisplayMemberBinding="{Binding HostName}" />
<GridViewColumn Header="IP" DisplayMemberBinding="{Binding IpAddress}" />
</GridView>
</ListView.View>
</ListView>
在ViewModel中,我创建了一个ICommand类型的属性,该属性在执行命令时被调用:
private DelegateCommand _listViewItemDoubleClickedCommand;
public ICommand ListViewItemDoubleClickedCommand
{
get
{
return _listViewItemDoubleClickedCommand ??
(_listViewItemDoubleClickedCommand = new DelegateCommand(item => Connect((DiscoveredServerItem) item)));
}
}
这很好用。正如你所看到的,我订阅了MouseDoubleClick活动。
现在我还想订阅MouseDown活动。这就是问题的开始。
我搜索了很多,似乎要将命令附加到ListViewItem的事件并不是那么容易。是否有机会以这种方式添加第二个命令?AttachedCommandBehavior v2确实支持BindingCollection,但我不知道如何在样式中使用它。
谢谢你的帮助caldicot
编辑:
以下是更多信息。
我想把选中的项目写在一个文本框中(点击触发)。我无法将所选项目直接绑定到文本框,因为用户应该仍然能够在该文本框中编写自定义服务器ip。
双击后,客户端应连接到文本框中指定的服务器。也许还有其他解决方案?
我无法使用ListView中的SelectionChanged事件,因为当用户选择一个项目,然后修改文本框时,单击同一个项目时,选择更改事件将不再触发。由于ListView中可能只有一个条目,因此用户没有机会重新选择此项。
您可以尝试以下操作:
<ListView x:Name="ServerListView" Height="200" ItemsSource="{Binding Servers, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}">
<ListView.InputBindings>
<MouseBinding MouseAction="LeftDoubleClick" Command="{Binding ElementName=ServerListView, Path=DataContext.ListViewItemDoubleClickedCommand}" CommandParameter="{Binding}" />
<MouseBinding MouseAction="LeftClick" Command="{Binding ElementName=ServerListView, Path=DataContext.SomeOtherOrSameCommand}" CommandParameter="{Binding}" />
</ListView.InputBindings>
<ListView.View>
<GridView>
<GridViewColumn Header="Dienstname" DisplayMemberBinding="{Binding ServiceName}" />
<GridViewColumn Header="Servername" DisplayMemberBinding="{Binding HostName}" />
<GridViewColumn Header="IP" DisplayMemberBinding="{Binding IpAddress}" />
</GridView>
</ListView.View>
</ListView>