下面的代码的工作方式如下:显示一个带有排序名称列表的表单。单击按钮时,新名称将添加到列表中文本框的适当排序位置。当双击列表中的某个项目时,它会以“AAA”为前缀,这会触发它被放置在列表的顶部。当我将 ObservableCollection 更改为 List 时,这种行为当然会消失。但是我怎么能模仿呢???我尝试实现 INotifyPropertyChanged,我在列表框的 BindingExpression 上调用了 UpdateTarget() 方法,都无济于事......
我有以下 XAML:
<Window x:Class="CollectionViewSpike.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<StackPanel>
<TextBox Name="NewNameBox" Text="{Binding NewName, UpdateSourceTrigger=PropertyChanged}"/>
<Button Click="Button_Click"">Add</Button>
<ListBox Name="listbox" ItemsSource="{Binding MyCollectionViewSource.View}"
MouseDoubleClick="listbox_MouseDoubleClick"/>
</StackPanel>
后面的代码:
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;
using System.Windows.Data;
using System.Windows.Input;
namespace CollectionViewSpike
{
public partial class Window1: Window
{
public ObservableCollection<string> Names { get; set; }
public static DependencyProperty NewNameProperty = DependencyProperty.Register("NewName", typeof (string),
typeof (Window1),
new PropertyMetadata(string.Empty));
public string NewName
{
get { return (string) GetValue(NewNameProperty); }
set{ SetValue(NewNameProperty,value);}
}
public Window1()
{
InitializeComponent();
var names = new string[] { "onno", "friso","andre"};
Names = new ObservableCollection<string>(names);
collectionViewSource = new CollectionViewSource { Source = Names };
collectionViewSource.SortDescriptions.Add(
new SortDescription("", ListSortDirection.Ascending));
DataContext = this;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
NewName = NewName ?? "???";
Names.Add(NewName);
NewName = string.Empty;
}
private CollectionViewSource collectionViewSource;
public CollectionViewSource MyCollectionViewSource
{
get { return collectionViewSource; }
private set { collectionViewSource = value;}
}
private void listbox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
var user = (string)listbox.SelectedItem;
int index = Names.IndexOf(user);
Names[index]="AAA"+Names[index];
}
}
}