Warum wird eine Eigenschaft in meinem ViewModel nicht aktualisiert, wenn sich DataGrid ändert?

Ich versuche, ein UserControl zu erstellen, mit dem ich ein Wörterbuch des Typs bearbeiten kannDictionary<string,string> in einem Raster (nur Einträge bearbeiten, nicht hinzufügen oder löschen).

Immer wenn ich das DataGrid an ein Dictionary binde, wird das Grid als schreibgeschützt angezeigt. Daher habe ich beschlossen, einen Wertekonverter zu erstellen, der es in ein konvertiertObservableCollection<DictionaryEntry> woherDictionaryEntry ist nur eine Klasse mit zwei EigenschaftenKey, undValue.

Dies funktioniert für die Anzeige des Wörterbuchs im Raster. Wenn ich jedoch Änderungen am Raster vornehme, wird mein Wörterbuch nicht aktualisiert. Ich bin mir nicht sicher warum.

Ich denke, es ist entweder ein Problem mit der Art und Weise, wie ich meine Bindungen eingerichtet habe, oder mit meinem Wertkonverter. Wenn jemand Licht ins Dunkel bringen könnte, wäre das fantastisch.

Unten ist die kleinste Demo, die ich machen konnte, die zeigt, was ich tue. Auch hier ist das Problem, wenn ich Werte im Raster ändere, dieMyDictionary auf meinemMainViewModel wird nicht aktualisiert. Warum?

MainViewModel.cs

public class MainViewModel : INotifyPropertyChanged
{
    public MainViewModel()
    {
        _myDictionary = new Dictionary<string, string>()
            {
                {"Key1", "Value1"},
                {"Key2", "Value2"},
                {"Key3", "Value3"}
            };
    }
    private Dictionary<string, string> _myDictionary;
    public Dictionary<string, string> MyDictionary
    {
        get
        {
            return _myDictionary;
        }
        set
        {
            if (_myDictionary == value)
                return;
            _myDictionary = value;
            OnPropertyChanged("MyDictionary");
        }
    }
...
}

MainWindow.xaml

<Window ...>
    <Window.Resources>
        <local:MainViewModel x:Key="MainViewModel"></local:MainViewModel>
    </Window.Resources>
    <StackPanel Name="MainStackPanel" DataContext="{Binding Source={StaticResource MainViewModel}}">
        <local:DictionaryGrid />
        <Button Content="Print Dictionary" Click="PrintDictionary"></Button>        
    </StackPanel>
</Window>

DictionaryGrid.xaml

<UserControl ...>
      <UserControl.Resources>
         <testingGrid:DictionaryToOcConverter x:Key="Converter" />
     </UserControl.Resources>
    <Grid>
        <DataGrid ItemsSource="{Binding MyDictionary, 
                                  Converter={StaticResource Converter}}" 
         />
    </Grid>
</UserControl>

DictionaryToOcConverter.cs

public class DictionaryToOcConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var collection = new ObservableCollection<DictionaryEntry>();
        var dictionary = value as Dictionary<string, string>;
        if (dictionary != null)
        {
            foreach (var kvp in dictionary)
                collection.Add(new DictionaryEntry { Key = kvp.Key, Value = kvp.Value });
        }
        return collection;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var dictionary = new Dictionary<string, string>();

        var entries = value as ObservableCollection<DictionaryEntry>;
        if (entries != null)
        {
            foreach (var entry in entries)
                dictionary.Add(entry.Key, entry.Value);
        }

        return dictionary;
    }
    public class DictionaryEntry
    {
        public string Key { get; set; }
        public string Value { get; set; }
    }
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage