0

下面的代码的工作方式如下:显示一个带有排序名称列表的表单。单击按钮时,新名称将添加到列表中文本框的适当排序位置。当双击列表中的某个项目时,它会以“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];
    }
}

}

4

2 回答 2

0

我不确定你为什么不只使用 ObservableCollection - 这就是它的用途。但是,无论如何,您可能还必须实现 INotifyCollectionChanged 以让绑定知道内容或顺序已更改。

ObservableCollection 的 msdn 参考

于 2009-11-03T14:00:30.560 回答
0

找到了。将 MyCollectionViewSource.View.Refresh() 添加到更改底层不可观察枚举的方法<T> 假设 Observable <string> Names 现在是 List <string> Names:

   private void Button_Click(object sender, RoutedEventArgs e)
    {
        NewName = NewName ?? "???";
        Names.Add(NewName);
        NewName = string.Empty;
        MyCollectionViewSource.View.Refresh();
    }

   private void listbox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        var user = (string)listbox.SelectedItem;
        int index = Names.IndexOf(user);
        Names[index]="AAA"+Names[index];
        MyCollectionViewSource.View.Refresh();
    } 
于 2009-11-03T17:24:41.920 回答