WPF Combobox „przecieka” pamięć

Wystąpił problem z polami kombi w WPF, gdzie wydają się wisieć na pierwszym DataContext, w którym zostały otwarte. Gdy zmieniam DataContext na moim ComboBox, potomny obiekt PopupRoot nadal odwołuje się do starego DataContext.

Początkowo zakładałem, że robimy coś złego, ale miałem problem z ustaleniem, co to może być, więc spróbowałem uprościć. Udało mi się odtworzyć zachowanie, które widzę w naszej aplikacji, w bardzo prostej formie, więc wydaje się, że jest to bardziej błąd w implementacji ComboBox WPF. To brzmi trochę kontrowersyjnie, więc pomyślałem, że zwrócę się do stackoverflow o pomoc.

Podstawowy kod próbki znajduje się poniżej:

<Window x:Class="ComboBoxTest.MainWindow" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="150" Width="525">
    <DockPanel>
        <Button Click="ReloadModel" Width="137" Height="40">Reload Model</Button>
        <ComboBox Name="ComboBox" 
            ItemsSource="{Binding AvailableOptions}" 
            SelectedItem="{Binding SelectedOption}" 
            Width="235" Height="43">
        </ComboBox>
    </DockPanel>
</Window>

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<string> options)
    {
        _selectedOption = options.First();
        _availableOptions = new ObservableCollection<string>(options);
    }

    protected void RaisePropertyChanged(string propertyName)
    {
        var propertyChangedHandler = PropertyChanged;
        if (propertyChangedHandler != null)
        {
            propertyChangedHandler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;

    private readonly ObservableCollection<string> _availableOptions;
    public ObservableCollection<string> AvailableOptions
    {
        get
        {
            return _availableOptions;
        }
    }

    private string _selectedOption;
    public string SelectedOption
    {
        get { return _selectedOption; }
        set
        {
            if (_selectedOption == value)
            {
                return;
            }
            _selectedOption = value;
            RaisePropertyChanged("SelectedOption");
        }
    }
}

Kroki ku reprodukcji:
1) Uruchom aplikację
2) Otwórz Combobox (aby wyświetlał rozwijane opcje)
3) Kliknij przycisk „Przeładuj model”

W tym momencie pojawią się dwa obiekty ViewModel, starsza, nieoczekiwana instancja zostanie zakorzeniona jak: ViewModel-> PopupRoot-> Popup-> ComboBox-> MainWindow-> App

Czy to błąd, czy robię to źle?

Eamon

questionAnswers(2)

yourAnswerToTheQuestion