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中可能只有一个条目,因此用户没有机会重新选择此项。

WPF通过AttachedCommandBehavior列出ViewItem多个事件

您可以尝试以下操作:

<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>