Я пытаюсь получить два события 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 может быть только одна запись, у пользователя нет возможности повторно выбрать этот элемент.
Вы можете попробовать что-то вроде:
<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>