2012-03-10 33 views
-1

我對如何在MVVM應用程序中使用ObservableCollection和CollectionViews非常困惑。我對技術解釋不感興趣,你告訴我如何在綁定到ObservableCollection時實際使用CollectionView。ObservableCollection <T>,CollectionView和排序

我有一個列表框。 ListBox是綁定到ObservableCollection集合的數據。

我也有一個組合框。在ComboBox中,我有兩個字符串:「按字母排序」和「按逆序排序」。根據選擇哪個項目,邏輯分類操作發生。沒有什麼特別的。現在

,我還是有要求的。發生排序時不得有任何視覺副作用。

例如:

  1. 用戶看到 「M」, 「N」,在列表框 「○」,他選擇 「n」 個,那麼他排序反向的字母順序。
  2. 用戶現在看到的 「o」, 「N」, 「M」。列表框不會以任何方式進行滾動。用戶仍應該看到「n」被選中(SelectedItem被綁定到ViewModel,並且沒有更改事件應該被觸發)。

是我想要達到的目標嗎?沒有代碼,因爲我真的不知道CollectionView是否意味着支持這一點。

如果你能指點我一個關於這個的教程,那也會有幫助(最好是有完整代碼的)。我真的找不到像動態排序列表框那樣簡單的教程。

+0

總之,沒有技術解釋,您想知道如何查看CollectionView,因爲您找不到教程,並且您不確定CollectionView是否是正確的工具。從MSDN搜索「CollectionView WPF」並且第一個項目有一個對ListBox進行排序的示例。 http://msdn.microsoft.com/en-us/library/ms754073.aspx – Paparazzi 2012-03-10 14:43:35

+0

他詢問如何同時保持在同一個地方當前選擇的項目進行排序。 – Phil 2012-03-10 15:16:07

+0

@Phil「找不到關於這樣簡單的教程爲動態排序列表框」這是張貼評論不是答案。 – Paparazzi 2012-03-10 20:12:37

回答

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); 
    } 
相關問題