我对如何在MVVM应用程序中使用ObservableCollection和CollectionViews格外感到困惑。我对技术解释不感兴趣,你告诉我当你绑定到ObservableCollection时你实际上是如何使用CollectionView的。
我有一个ListBox。 ListBox被数据绑定到ObservableCollection集合。
我也有一个ComboBox。在ComboBox中,我有两个字符串:“按字母顺序排序”和“按字母顺序排序”。根据选择的项目,将发生逻辑排序操作。这里没什么特别的。
现在,我仍然有要求。排序发生时必须没有视觉副作用。
例如:
我想要的是什么?没有代码,因为我真的不知道CollectionView是否支持这个。
如果你能指点我这方面的教程,那也会有所帮助(最好有一个完整的代码)。老实说,我找不到关于动态排序列表框这么简单的教程。
答案 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);
}