ObservableCollection <t>,CollectionView和排序</t>

时间:2012-03-10 10:34:30

标签: wpf collectionview

我对如何在MVVM应用程序中使用ObservableCollection和CollectionViews格外感到困惑。我对技术解释不感兴趣,你告诉我当你绑定到ObservableCollection时你实际上是如何使用CollectionView的。

我有一个ListBox。 ListBox被数据绑定到ObservableCollection集合。

我也有一个ComboBox。在ComboBox中,我有两个字符串:“按字母顺序排序”和“按字母顺序排序”。根据选择的项目,将发生逻辑排序操作。这里没什么特别的。

现在,我仍然有要求。排序发生时必须没有视觉副作用。

例如:

  1. 用户在ListBox中看到“m”,“n”,“o”,他选择“n”,然后按字母顺序排序。
  2. 用户现在看到“o”,“n”,“m”。 ListBox不以任何方式滚动。用户仍然应该看到“n”被选中(SelectedItem绑定到ViewModel,并且不应该触发任何更改事件)。
  3. 我想要的是什么?没有代码,因为我真的不知道CollectionView是否支持这个。

    如果你能指点我这方面的教程,那也会有所帮助(最好有一个完整的代码)。老实说,我找不到关于动态排序列表框这么简单的教程。

1 个答案:

答案 0 :(得分:0)

这样可以保持所选项目的选定和可见,但不一定在同一位置。如果所选项目下面有12个项目,那么从第二个到第二个排序,不会有12个项目放在它下面。

<DockPanel>
    <Button Click="OnClick" Width="30" Height="20" DockPanel.Dock="Top" HorizontalAlignment="Left">Sort</Button>
    <ListBox Name="myListBox" DockPanel.Dock="Top" ItemsSource="{Binding Path=MyListBoxCollection}" 
             SelectedItem="{Binding Path=MyListBoxSelectedItem, Mode=TwoWay}" >
        <ListBox.Resources>
            <Style TargetType="ListBoxItem">
                <Style.Resources>
                    <!-- This is the color used if the item is selected and the listbox has focus -->
                    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red"/>
                    <!-- Background of selected item when not focussed -->
                    <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="LightGreen" />
                </Style.Resources>
            </Style>
        </ListBox.Resources>
    </ListBox>
</DockPanel>


public partial class MainWindow : Window, INotifyPropertyChanged
{
    private List<ListBoxItem> myListBoxCollection = new List<ListBoxItem>();
    // private string myListBoxSelectedItem;

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

    public MainWindow()
    {
        ListBoxItem li;
        li= new ListBoxItem();
        li.Content = "delta0";
        myListBoxCollection.Add(li);
        li = new ListBoxItem();
        li.Content = "gamma0";
        myListBoxCollection.Add(li);
        li = new ListBoxItem();
        li.Content = "beta0";
        myListBoxCollection.Add(li);
        li = new ListBoxItem();
        li.Content = "alpha0";
        myListBoxCollection.Add(li);
        li = new ListBoxItem();
        li.Content = "delta1";
        myListBoxCollection.Add(li);
        li = new ListBoxItem();
        li.Content = "gamma1";
        myListBoxCollection.Add(li);
        li = new ListBoxItem();
        li.Content = "beta1";
        myListBoxCollection.Add(li);
        li = new ListBoxItem();
        li.Content = "alpha1";
        myListBoxCollection.Add(li);
        li = new ListBoxItem();
        li.Content = "delta2";
        myListBoxCollection.Add(li);
        li = new ListBoxItem();
        li.Content = "gamma2";
        myListBoxCollection.Add(li);
        li = new ListBoxItem();
        li.Content = "beta2";
        myListBoxCollection.Add(li);
        li = new ListBoxItem();
        li.Content = "alpha2";
        myListBoxCollection.Add(li);

        DataContext = this;

        InitializeComponent();
    }

    public List<ListBoxItem> MyListBoxCollection { get { return myListBoxCollection; } }

    public ListBoxItem MyListBoxSelectedItem { get; set; }

    private void OnClick(object sender, RoutedEventArgs e)
    {
        myListBox.Items.SortDescriptions.Add(new SortDescription("Content", ListSortDirection.Ascending));
        myListBox.ScrollIntoView(myListBox.SelectedItem);
    }