我有一个包含有关产品的元信息的软件(带有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存在。是否有一些更好,更灵活的方式来实现这样的东西?
答案 0 :(得分:0)
问题是TextBlock
不会收听CollectionChanged
事件。因此,您需要手动收听更改并更新后面代码中的TextBlock
,或者更好的是,引发TextBlock
可以从您ObservableDictionary
订阅的事件。
您可以找到使用List
here完成此操作的示例。