【发布时间】:2013-05-10 10:39:43
【问题描述】:
在“空白应用程序”(Visual C#,Windows 应用商店)中,我创建了一个新的“分组项页面”,然后声明了一个派生自 DependencyObject 的 MyItemViewModel 类,并具有 String Title 的依赖属性。
这是页面的 LoadState 方法:
protected async override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
{
this.DefaultViewModel["Groups"] = this.items;
this.items.Add(new MyItemViewModel { Title = "My Title" });
for (int i = 0; i < 5; i++)
{
await Task.Delay(1000);
this.items.First().Title += ".";
}
}
期望每秒钟在项目标题之后出现点。实际输出只是“我的标题”,没有其他任何事情发生。
通过添加以下 unreferenced 依赖属性,点就会出现:
public MyItemViewModel blah
{
get { return (MyItemViewModel)GetValue(blahProperty); }
set { SetValue(blahProperty, value); }
}
public static readonly DependencyProperty blahProperty =
DependencyProperty.Register("blah", typeof(MyItemViewModel), typeof(GroupedItemsPage1), new PropertyMetadata(0));
为什么GridView只有在有同类型的未使用依赖属性时才刷新item view model的Title属性?
视图模型类是否总是必须在应用程序的某处至少显式声明为依赖属性一次?
【问题讨论】:
-
我可能会误解您要做什么,但是在这种情况下,您可以使用 INotifyPropertyChanged 并在 Title 更新时调用 PropertyChanged 吗?
-
这可能是我的误解,但我期望 DependencyProperty 会处理通知,特别是因为它在声明虚拟属性时起作用。
-
DependencyObject 通常由 UIElement 继承(例如 Grid、TextBlock 等),它们的属性是 DependencyProperty,例如允许绑定。 ViewModel 应该实现 INotifyPropertyChanged 而不是从 DependencyObject 继承。如果您查看 GridApp 之类的示例模板,您会发现 BindableBase 实现了 INotifyPropertyChanged。
-
我从使用 DependencyObject 切换到 INotifyPropertyChanged,它可以工作。我想我并不完全理解 DependencyObject 的行为,但是如果视图模型不是视图,则视图模型不应该是 DependencyObjects 是有道理的。你想提交这个作为答案吗?
-
我刚刚发布了我的评论作为带有一些链接的答案。很高兴知道它可以解决您的问题。
标签: xaml binding windows-8 viewmodel dependency-properties