在 MVVM C#​​ WPF 中从 ObservableDictionary 捕获 ChangeEvents

Catch ChangeEvents from ObservableDictionary in MVVM C# WPF

我有一个包含产品元信息的软件(带有 GUI)。该信息的一部分是该产品组件的一些评级。

我想以某种方式为有人点击的每个产品显示此评级:

Part a: 100%
Part b: 20%
Part c: -
Part d: 40%

它可以有很多值,我不想为每个可能的评级创建一个自己的变量。

我的问题是我有很多缺失值,但我希望 GUI 始终看起来一样,所以我想到了一个可观察的字典来存储我的数据(来自有人点击的产品的动态 Web 界面) 并将 wpf 元素绑定到该字典的值。

我在这个 Whosebug post which contains a link to the Implementation.

中找到了一个 ObservableDictionary 的实现

以下是我的部分代码,用于说明我的问题所在:

我的视图实现如下所示:

<TextBlock Text="{Binding Path=Ratings, Converter={StaticResource ObservableDictionaryConverter}, ConverterParameter=Key}"/>

其中 Ratings 是我的 Observable Dictionary,Key 是我的硬编码组件(例如 "Part a"),ObservableDictionaryConverter 是一个转换器,如果存在则返回评级,如果不存在则返回“-”。

我的 ModelView 实现如下所示

public class Foo : Bindable
{
    ObservableDictionary<string, ComponentRatings> _ratings
    public ObservableDictionary<string, ComponentRatings> Ratings
        {
            get {return _ratings; }
            set
            {
                _ratings = value;
                OnPropertyChanged();
            }
        }
}

以及模特:

ViewModel.Ratings= new ObservableDictionary<string, ComponentRatings>();
foreach (var e in foo)
{
    ViewModel.Ratings.Add(e.Drive.ToString(), e);
}

1.) 如果我 运行 我的代码,gui 仅在由于我的 ModelView 中的 OnPropertyChanged() 实例化字典时更新自身 属性.但是当我向字典添加新元素时,我的 GUI 应该会自行更新并显示它们。那么我如何从我的 ModelView 中的 Observable 字典中捕获 CollectionChanged 事件?

2.) XAML 中的硬编码键不是很好,但我想不出更好的方法来始终获得我的所有评级GUI,即使它们不存在。有没有更好、更灵活的方法来实现这样的东西?

问题是 TextBlock 不监听 CollectionChanged 事件。因此,您需要手动侦听更改并在后面的代码中更新 TextBlock,或者更好的是,引发 TextBlock 可以从您的 ObservableDictionary 订阅的事件。

您可以找到一个示例,其中使用 List