WPF中如何重置Binding源且保持绑定有效性?
解决WPF重置绑定源后绑定失效的问题
你的问题核心在于**Container属性没有实现属性变更通知**。WPF的绑定系统只有在收到属性变更通知时,才会更新绑定的目标值。当前你直接给Container赋值新实例,但没有触发PropertyChanged事件,导致绑定仍然指向旧的Container实例,自然无法显示新的集合内容。
要在不直接修改ItemsSource的前提下保持绑定有效,只需要让Container属性支持INotifyPropertyChanged接口的通知机制即可,具体步骤如下:
1. 修改Container属性,添加变更通知
将MainWindow中的自动属性改为带后备字段的属性,并在赋值时触发PropertyChanged事件:
private MyClass _container; public MyClass Container { get => _container; set { _container = value; OnPropertyChanged(nameof(Container)); } }
2. 实现OnPropertyChanged方法
在MainWindow类中添加触发事件的方法(你已经实现了INotifyPropertyChanged接口,只需补充这个方法):
public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); }
修改后的完整C#代码
public partial class MainWindow : Window, INotifyPropertyChanged { public MainWindow() { Container = new MyClass() { InnerCollection = new ObservableCollection<string>() { "Start" } }; this.DataContext = this; InitializeComponent(); } private MyClass _container; public MyClass Container { get => _container; set { _container = value; OnPropertyChanged(nameof(Container)); } } public void AddNewItem(object sender, RoutedEventArgs e) { Container.InnerCollection.Add($"AddedItem"); } public void ResetSource(object sender, RoutedEventArgs e) { Container = new MyClass() { InnerCollection = new ObservableCollection<string>() { $"Reseted" } }; } public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } public class MyClass { public ObservableCollection<string> InnerCollection { get; set; } }
额外说明
如果后续你需要直接给MyClass的InnerCollection赋值新的ObservableCollection实例(而非修改现有集合内容),那么MyClass也需要实现INotifyPropertyChanged接口,否则绑定同样会失效。
内容的提问来源于stack exchange,提问作者Cobret
相关产品推荐
相关产品推荐

