在我的窗口上,我以这种方式初始化 DataContext:
public partial class MainWindow : MetroWindow
{
private ViewModelData data;
ResourceManager? resourceManager;
public MainWindow()
{
InitializeComponent();
data = new ViewModelData();
DataContext = data;
}
}
后来我添加了一些用户控件,将其传递给每个 CTOR:
var uc1 = new MyUserControl(data);
contentGrid.Children.Add(uc1);
var uc2 = new MyUserControl(data);
contentGrid.Children.Add(uc2);
(在每一个上,我都有这样的东西):
public MyUserControl(ViewModelData viewModelData)
{
data = viewModelData;
DataContext = data;
}
现在,在应用程序运行期间,如果在 Windows 上,我会执行以下操作:
data.field1 = "value"
它正确绑定值,并反映到用户控件的视图。
但是一旦我做了这样的事情:
data = JsonConvert.DeserializeObject<ViewModelData>(jsonContent) ?? new ViewModelData();
从外部 json 获取值,绑定似乎丢失,并且每个用户控件上的视图不再更新。
怎么了?我该如何解决它?也许我如何处理 DataContext 是错误的(WPF 上相当新)。
根本不要显式地将
data
值传递给 UserControls。它们的 DataContext
属性将自动继承 MainWindow 的 DataContext
属性的值。
在 UserControls 中根本不进行任何 DataContext 分配,并像这样创建它们:
var uc1 = new MyUserControl();
contentGrid.Children.Add(uc1);
var uc2 = new MyUserControl();
contentGrid.Children.Add(uc2);
当您稍后向 MainWindows 的 DataContext 分配新值时,UserControls 也将通过依赖属性值继承自动获取该值。
DataContext = JsonConvert.DeserializeObject<ViewModelData>(jsonContent)
?? new ViewModelData();