-1

MVVM アプリケーションで ObservableCollection と CollectionViews をどのように使用する必要があるかについて、私は非常に混乱しています。「ObservableCollectionにバインドするときに実際にCollectionViewを使用している」という技術的な説明には興味がありません。

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

コンボボックスもあります。ComboBox には、「Sort Alphabetically」と「Sort Reverse-Alphabetically」という 2 つの文字列があります。選択された項目に応じて、論理ソート アクションが発生します。ここでは特別なことは何もありません。

さて、まだ要件があります。並べ替えが発生したときに視覚的な副作用があってはなりません。

例えば:

  1. ユーザーは ListBox に "m"、"n"、"o" を表示し、"n" を選択して、逆アルファベット順に並べ替えます。
  2. ユーザーには「o」、「n」、「m」が表示されます。ListBox はスクロールしません。ユーザーには引き続き "n" が選択されているはずです (SelectedItem は ViewModel にバインドされており、変更イベントは発生していません)。

私が望んでいることは達成可能ですか?CollectionView がこれをサポートすることを意図しているかどうかは正直わからないので、コードはありません。

これに関するチュートリアルを教えていただければ、それも役立ちます(できれば完全なコードを含むもの)。正直なところ、リストボックスを動的にソートするのと同じくらい簡単なことについてのチュートリアルは見つかりませんでした。

4

1 に答える 1

0

これにより、選択したアイテムが選択されて表示されたままになりますが、必ずしも同じ位置にあるとは限りません。選択したアイテムが12個のアイテムで始まり、下から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);
    }
于 2012-03-10T20:57:45.393 に答える