从MVVM C#WPF中的ObservableDictionary捕获ChangeEvents

时间:2018-02-01 15:14:39

标签: c# wpf mvvm observablecollection

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

我希望以某种方式显示此评级对于某人点击的everey产品:

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

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

我的问题是我有很多缺失的值,但我希望GUI总是看起来一样,所以我想到了一个可观察的字典来存储我的数据(来自用户点击的产品的动态网络接口)和将wpf元素绑定到该字典的值。

我在此stackoverflow post中找到了一个ObservableDictionary的实现,其中包含指向Implementation的链接。

以下是我的代码的一些部分,以显示我的问题所在:

我的View实现如下所示:

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

其中,评级是我的可观察词典,Key是我的硬编码组件(例如&#34; Part a&#34;),ObservableDictionaryConverter是一个转换器,如果它存在,则返回评级或&#34; - &#34;如果它没有。

我的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。)如果我运行我的代码,由于我的ModelView属性中的OnPropertyChanged()实例化了字典,gui只会更新自身。但是当我向Dict添加新元素时,我的GUI应该自我更新并显示它们。那么我如何从ModelView中的Observable Dictionary中捕获CollectionChanged事件呢?

2。) XAML中的硬编码密钥并不是很好但是我无法想出更好的方法,即使他们没有&#,仍然在GUI中拥有我的所有评级39; t存在。是否有一些更好,更灵活的方式来实现这样的东西?

1 个答案:

答案 0 :(得分:0)

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

您可以找到使用List here完成此操作的示例。