带有Grouped CollectionViewSource的WPF ListBox不会取消选择第一个SelectedItem

时间:2012-06-15 17:17:07

标签: .net wpf xaml itemssource collectionviewsource

在.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中进行分组列表框;看起来很奇怪,这不是一个更为人熟知的问题。

0 个答案:

没有答案