WPF ListViewItem несколько событий через AttachedCommandBehaviour

1

Я пытаюсь получить два события ListViewItem, переданные моей ViewModel с AttachedCommandBehaviours.

Это мой стиль:

<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 в этом текстовом поле.

При двойном щелчке клиент должен подключиться к серверу, указанному в текстовом поле. Может быть, есть другое решение?

Я не могу использовать событие SelectionChanged из ListView, потому что, когда пользователь выбирает элемент, а затем изменяет текстовое поле, событие с измененным выбором больше не будет срабатывать при нажатии на ту же запись. Поскольку в ListView может быть только одна запись, у пользователя нет возможности повторно выбрать этот элемент.

  • 0
    Почему бы вам не попробовать InputBindings вместо AttachedCommandBehaviour
  • 0
    На самом деле я не знаю. Есть ли способ присоединить два InputBindings к ListViewItem? Можете ли вы опубликовать небольшой фрагмент кода?
Теги:
xaml
wpf
mvvm

1 ответ

0

Вы можете попробовать что-то вроде:

<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>
  • 1
    спасибо за фрагмент. Но это не работает. InputBindings добавляются в ListView, а не в ListViewItem. Таким образом, событие Click / DoubleClick вызывается при нажатии на ListView. Когда я щелкаю / дважды щелкаю на элементе в этом ListView, ничего не появляется. Пожалуйста, смотрите изменения в оригинальном сообщении.
  • 0
    У меня тоже такая же проблема с моим кодом :(

Ещё вопросы

Сообщество Overcoder
Наверх
Меню