【发布时间】:2018-02-01 15:14:38
【问题描述】:
我有一个包含产品元信息的软件(带有 GUI)。该信息的一部分是该产品组件的一些评级。
我想以某种方式为某人点击的每个产品显示此评分:
Part a: 100%
Part b: 20%
Part c: -
Part d: 40%
它可能有很多值,我不想为每个可能的评分创建一个自己的变量。
我的问题是我有很多缺失的值,但我希望 GUI 总是看起来一样,所以我想到了一个可观察的字典来存储我的数据(来自动态的网络界面,用于某人点击的产品)和将 wpf 元素绑定到该字典的值。
我在 stackoverflow post 中找到了 ObservableDictionary 的实现,其中包含指向 Implementation 的链接。
以下是我的代码的一些部分,以显示我的问题所在:
我的视图实现如下所示:
<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.) 如果我运行我的代码,则由于我的 ModelView 属性中的 OnPropertyChanged() 而实例化 Dictionary 时,gui 只会自行更新。但是当我向字典中添加新元素时,我的 GUI 应该会自行更新并显示它们。那么如何在我的 ModelView 中从 Observable Dictionary 中捕获 CollectionChanged 事件?
2.) XAML 中的硬编码键不是很好,但我想不出更好的方法来始终在 GUI 中显示我的所有评分,即使它们不存在.有没有更好、更灵活的方法来实现这样的事情?
【问题讨论】:
-
TextBlock不听CollectionChanged。也许这可以帮助你:stackoverflow.com/questions/36661607/… -
谢谢!!这正是问题所在。让它成为答案,您将获得 15 声望 ;-)
-
不客气 :)
标签: c# wpf mvvm observablecollection