Следующий код xaml создает ListView с тремя столбцами.ListView ItemsSource является наблюдаемой коллекцией.Первый столбец показывает имя объекта в определенной строке.Во втором и третьем столбцах показаны кнопки, связанные с объектом в определенной строке.
<Grid Width="497" Height="260">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="309*" />
<ColumnDefinition Width="188*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="478*" />
<RowDefinition Height="4*" />
</Grid.RowDefinitions>
<GroupBox Header="ObservableCollection Object List" HorizontalAlignment="Left" Width="497" BorderBrush="Black" BorderThickness="2" Grid.ColumnSpan="2">
<ListView ItemsSource="{Binding Path=CollectionList}" Name="QueueListView">
<ListView.Resources>
<Style TargetType="{x:Type ListViewItem}">
<EventSetter Event="PreviewGotKeyboardFocus" Handler="SelectCurrentItem"/>
</Style>
</ListView.Resources>
<ListView.SelectedItem>
<Binding Path="SelectedObjectFromList" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" >
</Binding>
</ListView.SelectedItem>
<ListView.View>
<GridView>
<GridViewColumn Width="140" Header="Object Name" DisplayMemberBinding="{Binding Name}" />
<GridViewColumn Width="160" Header="Property Information">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Button Content="Get Property Info" Command="{Binding Path=GetObjProperties}"
DataContext="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType=ListView}}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Width="180" Header="Transfer">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Button Content="Transfer Object" Command="{Binding Path=TransferObjHere}"
DataContext="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType=ListView}}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
</GroupBox>
</Grid>
Обработчик события SelectCurrentItem связывает ListView.SelectedItem со свойством SelectedObjectFromList в моей модели представления, когдапользователь нажимает кнопку «Передать объект» или «Получить информацию о недвижимости».Я использую это свойство для предоставления выбранного объекта моей модели представления.
Вот мой код c # обработчика SelectCurrentItem в коде:
protected void SelectCurrentItem(Object sender, KeyboardFocusChangedEventArgs e)
{
ListViewItem viewItem = (ListViewItem)sender;
viewItem.IsSelected = true;
}
Это прекрасно работает!Когда пользователь нажимает кнопку, свойство SelectedObjectFromList обновляется из объекта ListView observablecollection для этой строки.(Нет необходимости вручную щелкать строку ListView, чтобы установить свойство перед нажатием кнопки.)
Одна проблема: при нажатии кнопок в списке недавно выбранные строки по-прежнему отображаются выбранными (они подсвечиваются вGUI).
Я попытался решить проблему, установив свойство isFocused объекта ListView:
protected void SelectCurrentItem(Object sender, KeyboardFocusChangedEventArgs e)
{
ListViewItem Item = (ListViewItem)sender;
Item.IsSelected = true;
Item.IsFocused = true;
}
Конечно, это дает мне исключение StackOverflow :).У кого-нибудь есть пример кода для обновления ListView.Selection в GUI в этом случае?Заранее спасибо.