次のxamlコードは、3つの列を持つリストビューを生成します。 ListView ItemsSourceは、observablecollectionです。最初の列には、特定の行のオブジェクトの名前が表示されます。第2列および第3列には、特定の行のオブジェクトに関連付けられたボタンが表示されます。ユーザーは「転送オブジェクト」または「プロパティ情報を取得」ボタンをクリックしたときに 新しい行を選択すると、リストビューの行が選択されたままになる
<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イベントハンドラ
は、私の見解モデルでSelectedObjectFromListプロパティにListView.SelectedItemをバインドします。このプロパティを使用して、選択したオブジェクトをビューモデルに公開します。は、ここでの背後にあるコードで私のSelectCurrentItemハンドラのC#のコードです:
protected void SelectCurrentItem(Object sender, KeyboardFocusChangedEventArgs e)
{
ListViewItem viewItem = (ListViewItem)sender;
viewItem.IsSelected = true;
}
これは素晴らしい作品!ユーザーがボタンをクリックすると、その行のListView observablecollectionオブジェクトからSelectedObjectFromListプロパティが更新されます。
1つの問題:リスト内のボタンをクリックすると、最近選択された行が選択されているように見えます(GUIでハイライト表示されています) )。
私はListViewコントロールのisFocusedプロパティを設定することで問題を解決しようとした:私はStackOverflowののexeptionを与えるもちろんprotected void SelectCurrentItem(Object sender, KeyboardFocusChangedEventArgs e)
{
ListViewItem Item = (ListViewItem)sender;
Item.IsSelected = true;
Item.IsFocused = true;
}
:)。誰もが、この場合のGUIでListView.Selectionを更新するサンプルコードを持っていますか?前もって感謝します。
タグはタイトルには含まれません。 –