为什么将对象反序列化到 DataContext 会丢失所有绑定?

问题描述 投票:0回答:1

在我的窗口上,我以这种方式初始化 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 上相当新)。

c# wpf datacontext
1个回答
0
投票

根本不要显式地将

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();
© www.soinside.com 2019 - 2024. All rights reserved.