Wie das Verhalten eines ObservableCollection für eine Liste zu imitieren, wenn es sich um eine Quelle für eine Collection ist?

StackOverflow https://stackoverflow.com/questions/1667391

Frage

Der Code funktioniert unten wie folgt: ein Formular mit einer Liste der sortierten Namen angezeigt wird. Wenn die Taste ein neuer Name angeklickt wird, wird an der entsprechenden Position sortierte aus der Textbox in die Liste aufgenommen. Wenn ein Element der Liste doubleclicked wird, wird es mit „AAA“, vorangestellt, die es auslöst, oben auf der Liste platziert werden. Als ich die ObservableCollection zu einer Liste ändern verschwindet dieses Verhalten natürlich. Aber wie kann ich es mimick ??? Ich habe versucht, die Umsetzung INotifyPropertyChanged, rief ich die Update () -Methode auf die Binding des listbox, alles ohne Erfolg ...

Ich habe folgende 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>

Der Code hinter:

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];
    }
}

}

War es hilfreich?

Lösung 2

es gefunden. In MyCollectionViewSource.View.Refresh () ein Verfahren, das die darunter liegende nicht beobachtbar enumerable<T ändert> Angenommen, die Observable<string> Namen ist nun ein List<string> Namen:

   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();
    } 

Andere Tipps

Ich bin mir nicht sicher, warum Sie nicht nur eine ObservableCollection verwenden würden - das ist, was sein für. Aber wie auch immer, werden Sie wahrscheinlich auch INotifyCollectionChanged zu implementieren haben die Bindung zu können, dass der Inhalt oder die Bestellung geändert.

Msdn Referenz für ObservableCollection

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top