-1

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

我有一个列表框。ListBox 数据绑定到 ObservableCollection 集合。

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

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

例如:

  1. 用户在 ListBox 中看到“m”、“n”、“o”,他选择“n”,然后按字母顺序反向排序。
  2. 用户现在看到“o”、“n”、“m”。ListBox 不会以任何方式滚动。用户仍应看到“n”被选中(SelectedItem 绑定到 ViewModel 并且不应触发任何更改事件)。

我想要的可以实现吗?没有代码,因为老实说我不知道​​ CollectionView 是否旨在支持这一点。

如果您可以向我指出有关此的教程,那也会有所帮助(最好是带有完整代码的教程)。老实说,我找不到像动态排序列表框这样简单的教程。

4

1 回答 1

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);
    }
于 2012-03-10T20:57:45.393 回答