2012-03-10 20 views
-1

ObservableCollectionとCollectionViewsをMVVMアプリケーションで使用する方法については、私は非常に混乱しています。 ObservableCollectionにバインドするときに実際にCollectionViewを使用している方法を教えてくれる技術的な説明に興味はありません。ObservableCollection <T>、CollectionView、およびソート

私はListBoxを持っています。 ListBoxは、ObservableCollectionコレクションにデータバインドされています。

私もComboBoxを持っています。 ComboBoxには、「アルファベット順に並べ替える」と「アルファベット順に並べ替える」という2つの文字列があります。どの項目が選択されているかに応じて、論理ソートアクションが発生します。ここには何も特別なものはありません。

今、まだ要件があります。並べ替えが発生すると、視覚的な副作用がないはずです。例えば

  1. ユーザ "M"、 "N"、 "O" リストボックスに表示される、彼は "n" を選択し、その後、彼は逆アルファベット順にソートします。
  2. ユーザは "o"、 "n"、 "m"と表示されるようになりました。 ListBoxは決してスクロールしません。ユーザーは「n」が選択されていることを確認してください(SelectedItemはViewModelにバインドされており、変更イベントは発生しません)。

達成可能なものはありますか? CollectionViewがこれをサポートすることを正直に知らないので、コードはありません。

これについてのチュートリアルを私に指摘できれば、それも助けになります(完全なコードを含むものが好ましい)。私は正直なところ、リストボックスを動的に並べ替えるだけの簡単なチュートリアルは見つけられませんでした。

+0

は要約すると、技術的な説明は、あなたがチュートリアルを見つけることができなかったので、CollectionViewする方法を知りたいん、とCollectionViewは適切なツールである場合は、確認されていません。 "CollectionView WPF"のMSDN検索から、最初の項目にはListBoxのソートに関するサンプルがあります。 http://msdn.microsoft.com/en-us/library/ms754073.aspx – Paparazzi

+0

彼は同じ場所に現在選択されている項目を維持しながら並べ替える方法を尋ねています。 – Phil

+0

@Phil「リストボックスを動的に並べ替えるだけの簡単なことについてのチュートリアルを見つけることができませんでした」これは解答ではなくコメントとして投稿されました。 – Paparazzi

答えて

0

これは選択されたアイテムを選択して表示しますが、必ずしも同じ位置にあるとは限りません。選択された項目が12項目で開始され、次に2項目から2項目にソートされた場合、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); 
    } 
関連する問題