.NET 4.0 でグループ化された CollectionViewSource ItemsSource を持つ LisBox に問題があります。バグであることは確かですが、適切な回避策が見つかりません。これは、問題を再現するためのコード全体です。
<Window x:Class="LBBug.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:LBBug"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<local:ViewModel />
</Window.DataContext>
<Window.Resources>
<CollectionViewSource Source="{Binding Data}" x:Key="cvs">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="GroupCol" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</Window.Resources>
<Grid>
<ListBox ItemsSource="{Binding Source={StaticResource cvs}}" IsSynchronizedWithCurrentItem="True">
<ListBox.GroupStyle>
<GroupStyle>
</GroupStyle>
</ListBox.GroupStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Col1}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Window>
public class Model
{
public string GroupCol { get; set; }
public string Col1 { get; set; }
public string Col2 { get; set; }
}
public class ViewModel
{
private List<Model> m_Data;
public List<Model> Data
{
get
{
if (m_Data == null)
{
m_Data = new List<Model>();
m_Data.Add(new Model { GroupCol = "Group1", Col1 = "Col1-1", Col2 = "Col2-1" });
m_Data.Add(new Model { GroupCol = "Group1", Col1 = "Col1-1", Col2 = "Col2-1" });
m_Data.Add(new Model { GroupCol = "Group1", Col1 = "Col1-1", Col2 = "Col2-1" });
m_Data.Add(new Model { GroupCol = "Group2", Col1 = "Col1-2", Col2 = "Col2-2" });
m_Data.Add(new Model { GroupCol = "Group2", Col1 = "Col1-2", Col2 = "Col2-2" });
m_Data.Add(new Model { GroupCol = "Group2", Col1 = "Col1-2", Col2 = "Col2-2" });
}
return m_Data;
}
}
}
Window が起動すると、最初の項目が CVS で選択され、ListBox で選択されます。
[画像を投稿できません。最初のグループの最初のアイテムが選択されたグループ化されたリストボックスを含む単純なウィンドウを視覚化します]
新しい項目 (ここでは位置 2) をクリックすると、最初に選択した項目が選択解除されません。CVS は新しく選択された項目で更新されますが、最初の項目 (位置 0) を直接クリックしても、その項目から移動すると再選択できません。
[1 番目と 3 番目の項目が選択されたリストボックスを視覚化します。はい、単一選択モードです]
マウスを押したまま「スタック」アイテムの上でリストを上下にドラッグすると、選択が解除されて機能し始めます。また、キーボードを使用して動かなくなったアイテムにカーソルを戻すと、キーボードで下に移動すると選択が解除されます。問題は、CVS で選択された最初の項目にあります (つまり、位置 0 だけではありません)。
プロジェクトを .NET 3.5 に変更すると、期待どおりに動作します。これが報告されているのを見たことがありますが、4.0 で修正された場所を見たと思いました。
これに対する合理的な回避策を考えられますか? IsSynchronized.. をオンにして、CVS への変更を手動で監視し、タイマーを使用して現在の項目を LB に設定することで、ある程度機能させることができますが、それは非常に面倒で、すべてのシナリオに対処するのが難しくなっています。基礎となるデータを操作し、ListBox が選択された内容に対応できるようにしたいと考えています。
これに対処する簡単な方法があることを本当に望んでいます。現状では、.NET 4 でグループ化されたリストボックスを実際に実行できないようです。非常に奇妙に思えますが、これはあまり知られていない問題です。