SORU
22 EKİM 2008, ÇARŞAMBA


Bir ObservableCollection Temizleniyor, e Öğeleri vardır.Oldİtems

Hazırlıksız yakalandım bir şey var.

Öğeleri doldurulmuş T bir ObservableCollection var. Ben de bir olay işleyicisi CollectionChanged olay bağlı.

Sen ne zamanTemizleyinkoleksiyonu e CollectionChanged olay neden olur.Eylem NotifyCollectionChangedAction için ayarlayın.Reset. Tamam, bu normal. Ama garip ne bu ne e.Oldİtems ya da e.Newİtems bir şey var.E beklerdim.Koleksiyonundan kaldırılan tüm öğeler ile dolu olmak Oldİtems.

Bunu başka gören var mı? Ve eğer öyleyse, nasıl bakayım onlar?

Ve başka bir olay iliştirin için CollectionChanged olay kullanıyorum ve böylece e herhangi bir ürün almak istemiyorum.biraz arka plan: Oldİtems ... bu olay ayırmak mümkün olmayacaktır.


AÇIKLAMA: Belgelere olmadığını biliyorumdüpedüzböylesi bir davranış olduğunu belirtin. Ama diğer her eylem için, ne yaptığını bana bildiren. Yani, benim varsayım bana verecekti. Net/Sıfırla de.


Aşağıda eğer kendinizi yeniden oluşturmak istiyorsanız örnek kod. Öncelikle xaml:

<Window
    x:Class="ObservableCollection.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>
        <Button x:Name="addButton" Content="Add" Width="100" Height="25" Margin="10" Click="addButton_Click"/>
        <Button x:Name="moveButton" Content="Move" Width="100" Height="25" Margin="10" Click="moveButton_Click"/>
        <Button x:Name="removeButton" Content="Remove" Width="100" Height="25" Margin="10" Click="removeButton_Click"/>
        <Button x:Name="replaceButton" Content="Replace" Width="100" Height="25" Margin="10" Click="replaceButton_Click"/>
        <Button x:Name="resetButton" Content="Reset" Width="100" Height="25" Margin="10" Click="resetButton_Click"/>
    </StackPanel>
</Window>

Ardından kod arkasında:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;

namespace ObservableCollection
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            _integerObservableCollection.CollectionChanged  = new System.Collections.Specialized.NotifyCollectionChangedEventHandler(_integerObservableCollection_CollectionChanged);
        }

        private void _integerObservableCollection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            switch (e.Action)
            {
                case System.Collections.Specialized.NotifyCollectionChangedAction.Add:
                    break;
                case System.Collections.Specialized.NotifyCollectionChangedAction.Move:
                    break;
                case System.Collections.Specialized.NotifyCollectionChangedAction.Remove:
                    break;
                case System.Collections.Specialized.NotifyCollectionChangedAction.Replace:
                    break;
                case System.Collections.Specialized.NotifyCollectionChangedAction.Reset:
                    break;
                default:
                    break;
            }
        }

        private void addButton_Click(object sender, RoutedEventArgs e)
        {
            _integerObservableCollection.Add(25);
        }

        private void moveButton_Click(object sender, RoutedEventArgs e)
        {
            _integerObservableCollection.Move(0, 19);
        }

        private void removeButton_Click(object sender, RoutedEventArgs e)
        {
            _integerObservableCollection.RemoveAt(0);
        }

        private void replaceButton_Click(object sender, RoutedEventArgs e)
        {
            _integerObservableCollection[0] = 50;
        }

        private void resetButton_Click(object sender, RoutedEventArgs e)
        {
            _integerObservableCollection.Clear();
        }

        private ObservableCollection<int> _integerObservableCollection = new ObservableCollection<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 };
    }
}

CEVAP
3 HAZİRAN 2010, PERŞEMBE


Sıfırlama liste temizlendi anlamına gelmez çünkü yaşlı öğeler içerdiğini değil

Demek ki dramatik bir şeyin alındığı yer, ve maliyet çalışma dışarı add/kaldırır büyük olasılıkla aşan maliyeti sadece yeniden tarama listesinden çizik... o zaman şunu yapmalısınız.

MSDN tüm koleksiyonu yeniden sıralanmış sıfırlamak için bir aday olarak bir örnek gösteriyor.

Yinelemek.Sıfırlamak, temizlemek anlamına gelmezdemekListeyle ilgili varsayımlar artık geçersizdir. Eğer tamamen yeni bir liste gibi davranın. Bu açık bir örneği oluyor, ama başkaları da olabilir.

Bazı örnekler:
Bu öğeleri bir sürü ile böyle bir liste vardı ve bir WPF ListView ekran üzerinde görüntülemek için veri sınırlama olmuştur.
Eğer açık liste ve arttırma .Reset olay, performans hemen hemen anlık, ama eğer yerine zam birçok bireysel .Remove olaylar, performansı çok mu kötü, WPF kaldırır öğeleri tek tek. Ayrıca benim kendi kod .Reset liste yeniden sıralanmış olan, Move bireysel işlemler binlerce vermeden yerine belirtmek için kullandım. Net olarak, büyük bir performans birçok bireysel olaylar kaldırırken isabet yoktur.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Plugable

    Plugable

    19 Mayıs 2010
  • RogerBuckChrist

    RogerBuckChr

    9 Temmuz 2011
  • Sam Kear

    Sam Kear

    14 Temmuz 2007