How to update binding in WPF?

I have some ObservableCollections bound to some WPF controls and they work fine. And I have a function where I completely replace these ObservableCollections with reassignment and populate them again, but after that the WPF controls are not updated.

Or is this connecting connection established only at startup once, and then I should never repeat the initialization of ObservableCollections, but only change them?

EDIT:

public partial class MainWindow : Window { ObservableCollection<EffectViewModel> effects; public ObservableCollection<EffectViewModel> Effects { get { return this.effects; } set { this.effects = value; this.RaisePropertyChanged ( "Effects" ); } } public event PropertyChangedEventHandler PropertyChanged; void RaisePropertyChanged ( string name ) { var handler = this.PropertyChanged; if ( handler != null ) handler ( this, new PropertyChangedEventArgs ( name ) ); } } public void LoadEffects ( string path, string filename ) { //returns new ObservableCollection<EffectViewModel> ( ); this.Effects = File.Load ( path, filename ); } public class EffectViewModel { public bool this [ EffectType type ] { get { return AllEffects.First ( e => e.Type == this.Type ).IsSupported; } set { AllEffects.First ( e => e.Type == this.Type ).IsSupported = value; this.RaisePropertyChanged ( "this" ); } } #region Events public event PropertyChangedEventHandler PropertyChanged; void RaisePropertyChanged ( string name ) { var handler = this.PropertyChanged; if ( handler != null ) handler ( this, new PropertyChangedEventArgs ( name ) ); } #endregion } 

EDIT2:

 <Window x:Class="EffectWindow.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" DataContext="{Binding RelativeSource={RelativeSource Self}}" Title="Effect Display" Height="200" Width="700" <DockPanel VerticalAlignment="Stretch"> <ListView ItemsSource="{Binding Effects}" AlternationCount="2" DockPanel.Dock="Top" HorizontalContentAlignment="Stretch"> <ListView.View> <GridView> <GridViewColumn Width="70" Header="GPU"> <GridViewColumn.CellTemplate> <DataTemplate> <CheckBox Margin="0" HorizontalAlignment="Center" IsChecked="{Binding [GPU], Mode=TwoWay}"/> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn Width="70" Header="CPU"> <GridViewColumn.CellTemplate> <DataTemplate> <CheckBox Margin="0" HorizontalAlignment="Center" IsChecked="{Binding [CPU], Mode=TwoWay}"/> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> </GridView> </ListView.View> </ListView> </DockPanel> </Window> 
+6
c # wpf
source share
3 answers

The object you are binding to must implement the INotifyPropertyChanged interface. Then, the related collection property should raise the PropertyChanged event in its setter. Something like that:

 public ObservableCollection<MyObject> MyCollection { get { return _myCollection; } set { _myCollection = value; RaisePropertyChanged("MyCollection"); } } 
+5
source share

Try not to reassign, but to clean and add new elements.

+2
source share

You need to know the dependency object and the dependency property where the binding was defined. Then you can use this line:

 BindingOperations.GetBindingExpressionBase(dependencyObject, dependencyProperty).UpdateTarget(); 
0
source share

All Articles