簡體   English   中英

視圖模型不會更新到 DataContext

[英]View model doesn't get updated to DataContext

我有一個工作程序,其中視圖模型將數據提供給視圖。 這是在構造函數和Refresh()方法中完成的,如下所示。 我通常會放置一個引用視圖模型的私有屬性,因為我想在與它通信時省略強制轉換。

public class TheView
{
  private ViewModel TheViewModel { get; set; }

  public TheView()
  {
    TheViewModel = new ViewModel();
    DataContext = TheViewModel;
  }

  public Refresh()
  {
    TheViewModel = new ViewModel();
    DataContext = TheViewModel;
  }
}

然后,我變得貪婪並開始追逐線條。 由於構造函數將DataContext連接到屬性TheViewModel ,我想我可以只分配給后者,而前者會自行更新它的內容。 令我失望的是,我發現事實並非如此。 以下內容為我提供了正確的對象列表,DataContext不受影響。

public class TheView
{
  private ViewModel TheViewModel { get; set; }

  public TheView()
  {
    TheViewModel = new ViewModel();
    DataContext = TheViewModel;
  }

  public Refresh() { TheViewModel = new ViewModel(); }
}

問題是為什么會這樣。 或者更確切地說,如果它應該是這樣的話。 我在想,如果它不應該表現得像這樣,也許我在代碼中的其他地方有問題會導致流程不暢......

我認為您確實需要了解DataContext是一個依賴屬性。

它的定義如下所示:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[Localizability(LocalizationCategory.NeverLocalize)]
public object DataContext
{
  get
  {
    return this.GetValue(FrameworkElement.DataContextProperty);
  }
  set
  {
    this.SetValue(FrameworkElement.DataContextProperty, value);
  }
}

...

    public static readonly DependencyProperty DataContextProperty = 
DependencyProperty.Register("DataContext", typeof (object...

依賴屬性不僅僅是普通的 .NET 屬性,因為它們支持

  • 變更通知
  • 屬性值繼承
  • 決定價值的提供者

在您的情況下,重要的是“更改通知”主題。

當您(重新)為作為依賴屬性的屬性(如DataContext )分配值時,WPF 將自動獲取此更改。 在這種情況下,可以這么說,更改通知是在依賴屬性的 setter 中完成的。

如果您分配給“普通”屬性甚至私有字段,則情況並非如此(不調用DataContext屬性的 setter),即使它指向 DataContext。

您基本上是在重新分配私有屬性,而不是 DataContext。

  1. 您創建TheViewModel實例 A
  2. 你讓 DataContext 指向實例 A
  3. 您創建TheViewModel實例 B
  4. 您使TheViewModel私有屬性指向實例 B
  5. DataContext 仍然指向實例 A

--> 沒有理由應該刷新 DataContext。 你沒有碰它。 它仍然指向仍在內存中的初始實例 A。

編輯

這個答案是假設綁定使用DataContext作為源,而不是TheViewModel DataContext是一個 DependencyProperty,而TheViewModel不是。 TheViewModel作為綁定源替換整個視圖模型需要使用依賴屬性或NotifyPropertyChanged通知視圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM