在一個「空白應用程序」(Visual C#,Windows應用商店)中,我創建一個新的「分組項目頁面」,然後聲明MyItemViewModel
從DependencyObject
派生的類與依賴項物業爲String Title
。當使用LayoutAwarePage.DefaultViewModel
這是頁面的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 += ".";
}
}
的意料的是,該項目的冠軍每一秒鐘後點出現。實際輸出只是「我的標題」,沒有其他事情發生。
通過將以下未引用依賴屬性點會出現在屏幕上:
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只刷新項目視圖模型的Title屬性時,有一個未使用的依賴屬性具有相同類型?
視圖模型類是否總是必須顯式聲明爲應用程序某處的依賴屬性至少一次?
我可能會誤解你正在嘗試做什麼,但是在這種情況下更新標題時,你可以使用INotifyPropertyChanged並調用PropertyChanged? – kimsk
這可能是我的誤解,但我期待的是DependencyProperty會處理通知,特別是因爲它在聲明瞭虛擬屬性時起作用。 – JoeGaggler
DependencyObject通常由UIElement(例如Grid,TextBlock等)繼承,它們的屬性是DependencyProperty,它允許(例如)綁定。 ViewModel應該實現INotifyPropertyChanged,而不是從DependencyObject繼承。如果您查看像GridApp這樣的示例模板,您會看到BindableBase實現了INotifyPropertyChanged。 – kimsk