在.NET 4.0中,LisBox与分组的CollectionViewSource ItemsSource存在问题。很确定这是一个错误,但找不到一个好的解决方法。这是重现问题的整个代码。
<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)。
[现在可视化列表框,其中选择了第一个和第三个项目;是的,它是单选模式]
如果我按住鼠标并在“卡住”项目上下拖动列表,它将取消选择并开始工作。此外,如果我使用键盘将光标复制回卡住的项目,当我使用键盘向下移动时,它将取消选择。问题在于在CVS中选择了初始项目(即不仅仅是位置0)。
如果我将项目更改为.NET 3.5,它将按预期工作。我已经看到了这个报道,但我以为我看到它在4.0中被修复了。
你能想到任何合理的解决办法吗?我可以通过转动IsSynchronized来实现它的工作..并手动观察CVS的变化,然后使用计时器设置LB上的当前项目,但这样做变得非常混乱并且难以处理所有场景。我希望能够操纵底层数据并使ListBox与所选内容保持同步。
真的希望有一种直接的方法来解决这个问题。事实上,似乎你无法真正在.NET 4中进行分组列表框;看起来很奇怪,这不是一个更为人熟知的问题。