2015-04-08 1 views
0

У меня есть эта наблюдаемая коллекция, где я добавляю свои элементы и привязываюсь к «Listbox» в xaml. Но я хочу сохранить клон этой наблюдаемой коллекции и привязать эту клонную наблюдаемую коллекцию к этому «списку» вместо оригинальной коллекции Observable Collection и сначала добавить элементы в эту клонированную наблюдаемую коллекцию и обновить Original Observable Collection щелчком по кнопке. Я использую MVVM Light для приложения.Как я могу сохранить две наблюдаемые коллекции с одинаковыми элементами в WPF ..?

Любая помощь для этого.? Это моя оригинальная наблюдаемая коллекция.

public ObservableCollection<ColumnNameDefinition> HistoricColumns { get; set; } 
+0

Использование можно использовать метод CopyTo https://msdn.microsoft.com/en-us/library/ms132408(v=vs.110).aspx – CodingDefined

+0

спасибо за ответ. Но я хочу обновить исходную коллекцию только новыми добавленными элементами в клонированной коллекции Observable с помощью нажатия кнопки. Могу ли я сделать это таким образом? –

+0

Он копирует всю коллекцию в совместимый одномерный массив, начиная с указанного индекса целевого массива, после чего вы можете иметь примечание о индексе массива, из которого вы добавили новые элементы ... поэтому оттуда вы можете обновить свой Original ObservableCollection – CodingDefined

ответ

1

Я не тестировал этот код, но он должен работать нормально. Я связал событие CollectionChanged с клоном, и я поддерживаю коллекцию изменений. Затем, если вы хотите зафиксировать изменения, просто выполните CommitChangesCommand, и все изменения добавляются в исходный код.

using System; 
using System.Collections.ObjectModel; 
using System.Collections.Specialized; 
using System.Linq; 
using System.Windows.Input; 

namespace WpfApplication1 
{ 
public class ViewModel 
{ 
    private readonly ObservableCollection<Item> _clone; 

    private readonly ObservableCollection<Item> _source; 

    private readonly Collection<Item> _changes = new Collection<Item>(); 

    public ViewModel(ObservableCollection<Item> items) 
    { 
     _source = items;    
     _clone = new ObservableCollection<Item>(items); 
     _clone.CollectionChanged += clone_CollectionChanged; 
    } 

    void clone_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     switch (e.Action) 
     { 
      case NotifyCollectionChangedAction.Add: 
       foreach (var newItem in e.NewItems.Cast<Item>()) 
       { 
        _changes.Add(newItem); 
       } 
       break; 
     } 
    } 

    public ObservableCollection<Item> Clone 
    { 
     get { return _clone; } 
    } 

    private DelegateCommand _commitChangesCommand; 

    public ICommand CommitChangesCommand 
    { 
     get { return _commitChangesCommand ?? (_commitChangesCommand = new DelegateCommand(CommitChanges, CanCommitChanges)); } 
    } 

    private void CommitChanges(object sender) 
    { 
     foreach (var change in _changes) 
     { 
      _source.Add(change); 
     } 

     _changes.Clear(); 
    } 

    private bool CanCommitChanges(object sender) 
    { 
     return _changes.Any(); 
    } 
} 

public class Item 
{ 
} 

public class DelegateCommand : ICommand 
{ 
    private readonly Predicate<object> _canExecute; 
    private readonly Action<object> _execute; 

    public event EventHandler CanExecuteChanged; 

    public DelegateCommand(Action<object> execute) 
     : this(execute, null) 
    { 
    } 

    public DelegateCommand(Action<object> execute, 
     Predicate<object> canExecute) 
    { 
     _execute = execute; 
     _canExecute = canExecute; 
    } 

    public bool CanExecute(object parameter) 
    { 
     return _canExecute == null || _canExecute(parameter); 
    } 

    public void Execute(object parameter) 
    { 
     _execute(parameter); 
    } 

    public void RaiseCanExecuteChanged() 
    { 
     if (CanExecuteChanged != null) 
     { 
      CanExecuteChanged(this, EventArgs.Empty); 
     } 
    } 
} 
}