WPF Combobox“泄漏”内存

我遇到了WPF中的combobox问题,它们似乎挂在它们打开的第一个DataContext上。 当我在ComboBox上更改DataContext时,子PopupRoot对象仍然引用旧的DataContext。

起初我以为我们做错了什么,但我在弄清楚可能是什么时遇到了麻烦,所以我试图简化。 我已经设法以一种非常简单的forms重新创建了我在应用程序中看到的行为,因此它看起来更像是WPF ComboBox实现中的一个错误。 这听起来有点争议,所以我想我会转向stackoverflow寻求帮助。

该示例的核心代码如下:

       public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); var newModel = new ViewModel(); ComboBox.DataContext = newModel; } private void ReloadModel(object sender, RoutedEventArgs e) { var newModel = new ViewModel(); ComboBox.DataContext = newModel; } } public class ViewModel : INotifyPropertyChanged { public ViewModel() : this(new[] { "Option 1", "Option 2", "Option 3" }) { } public ViewModel(IEnumerable options) { _selectedOption = options.First(); _availableOptions = new ObservableCollection(options); } protected void RaisePropertyChanged(string propertyName) { var propertyChangedHandler = PropertyChanged; if (propertyChangedHandler != null) { propertyChangedHandler(this, new PropertyChangedEventArgs(propertyName)); } } public event PropertyChangedEventHandler PropertyChanged; private readonly ObservableCollection _availableOptions; public ObservableCollection AvailableOptions { get { return _availableOptions; } } private string _selectedOption; public string SelectedOption { get { return _selectedOption; } set { if (_selectedOption == value) { return; } _selectedOption = value; RaisePropertyChanged("SelectedOption"); } } } 

重现步骤:
1)运行应用程序
2)打开Combobox(以便它呈现下拉选项)
3)单击“重新加载模型”按钮

此时将有两个ViewModel对象,较旧的意外实例根植于:ViewModel-> PopupRoot-> Popup-> ComboBox-> MainWindow-> App

这是一个错误还是我做错了?

埃蒙

乔的评论让我的注意力回到了我为自己使用而解决的这个老问题。 最后我写了一个行为,我可以附加到一个处理内存泄漏的combobox。

我在这里发布了代码: https : //github.com/EamonHetherton/Demos/blob/master/StackOverflow/18096050/StopComboBoxMemoryLeakBehaviour.cs

警告:这个解决方案依赖于反思和可能带来的脆弱性。 它适用于我,YMMV。