2015-06-11 4 views
0

ObservableCollection является самодостаточным, когда дело доходит до сбора события CollectionChanged, поскольку оно реализует INotifyPropertyChanged и INotifyCollectionChanged. Так что, я думаю, нам не нужно снова внедрять INotifyPropertyChanged.наблюдаемая коллекция и inotifypropertychanged

, но я видел пример, в котором люди определяют свойство ObservableCollection как свойство и событие с изменением свойства в setter. я не понимаю, почему это делается снова или в лучших словах, почему они являются изменением события Raising в setter (см. ниже код). Поскольку мы уже знаем, что ObservableCollection автоматически возникает при добавлении, обновление выполняется, тогда нам не нужно снова поднимать.

, пожалуйста, уточните мои сомнения.

public class TheViewModel() 
{ 
    private ObservableCollection<Camper> _campers; 
    public ObservableCollection<Camper> Campers 
    { 
     get { return _campers; } 
     set 
     { 
      if (Equals(_campers, value)) return; 

      _campers = value; 
      RaisePropertyChanged("Campers"); //Or however you implement it 
     } 
    } 
+0

Новые кемперы - это не то же самое, что добавлять или удалять из существующих кемперов. Campers.Add звонки не устанавливаются. – Paparazzi

ответ

0

Если вы установите Campers, чтобы указать на новый экземпляр, что RaisePropertyChanged будет делать работу за вас. В противном случае у вас будет ссылка на старый экземпляр, и представление останется не синхронизированным. Другое решение этого - каждый раз, когда вы устанавливаете Campers на новую коллекцию, снова устанавливайте ItemsSource для DataGrid или ListView или любого используемого вами элемента управления.

Действительно, это работает до тех пор, пока вы добавляете или удаляете предметы из своей коллекции. В заключение, вот в чем разница, когда вы снова установите

Campers = new ObservableCollection<Camper>(); 

Ваш RaisePropertyChanged будет запущен.

обновление Код:

XAML:

<Window x:Class="ObservablePropertyChanged.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <StackPanel> 
     <ListView ItemsSource="{Binding items}"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding}"/> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 
     <Button Content="Change collection" Click="btnChangeCollection_Click"/> 
    </StackPanel> 
</Grid> 

код позади:

public partial class MainWindow : Window 
{ 
    public ObservableCollection<string> items { get; set; } 

    public MainWindow() 
    { 
     InitializeComponent(); 
     items = new ObservableCollection<string>(); 
     items.Add("One"); 
     items.Add("Two"); 
     this.DataContext = this; 
    } 

    private void btnChangeCollection_Click(object sender, RoutedEventArgs e) 
    { 
     items = new ObservableCollection<string>(); 
     items.Add("Three"); 
     items.Add("Four"); 
    } 
} 

Как я не имеют интерфейс INPC реализованы и не PropertyChanged не добавлено набор предметов коллекции, кормовой er нажав кнопку, вы не получите View View с элементами «Three» и «Four».

А вот еще один способ сделать это поведение:

public ObservableCollection<string> items 
    { 
     get { return (ObservableCollection<string>)GetValue(itemsProperty); } 
     set { SetValue(itemsProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for items. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty itemsProperty = 
     DependencyProperty.Register("items", typeof(ObservableCollection<string>), typeof(MainWindow), new UIPropertyMetadata(null)); 

Используя это свойство зависимостей, то ListView будет оставаться в синхронизации.

+0

У меня есть привязка Кемперы на мой взгляд, и как только я добавляю элемент в лагеря, его обновляет вид, используя приведенный ниже код. Примечание: я удалил RaisePropertyChanged ("кемперы") общественного класса TheViewModel() { частные ObservableCollection _campers; public ObservableCollection Кемперы { get; комплект; } так что мой вопрос заключается в том, что наблюдаемая коллекция автоматически обновляет представление, тогда нам не нужно использовать RaisePropertyChanged. – shashank

+0

@shashank Без этого RaisePropertyChanged, если вы измените коллекцию, на которую указывает Campers, вы будете не в синхронизации. –

+0

Извините, я только что отредактировал свой комментарий. прочитайте его еще раз. – shashank

Смежные вопросы