在 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
。
我有一个包含产品元信息的软件(带有 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