Если вы установите 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 будет оставаться в синхронизации.
Новые кемперы - это не то же самое, что добавлять или удалять из существующих кемперов. Campers.Add звонки не устанавливаются. – Paparazzi