为什么JObject.Parse()不调用PropertyChanged?

时间:2017-04-21 16:00:28

标签: c# json

我在C#中使用JSON.NET。在我的代码中,Json String会定期解析为JObject dataObj。每次更改dataObj时,我都希望新的一个显示在UI的文本框中。这就是我想到这段代码的原因:

    internal void DisplayData()
    {
        dataObj.PropertyChanged += DataObj_PropertyChanged;
    }

    private async void DataObj_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        await dataBox.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, 
                              delegate { dataBox.Text = writeString; });
    }

writestring是转化为string的{​​{1}}。

我希望每次都会执行dataObj,达到行DataObj_PropertyChanged(),但事实并非如此。

我怎么能解决这个问题?还有其他选择吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

如果您希望在为{{1}分配新值时能够引发dataObj,则INotifyPropertyChanged所有者需要实施PropertyChanged }。

我假设dataObj是某个类的字段或属性。它必须是该类的属性。

但也许你不需要提出dataObj。如果您想要做的就是让自己的类在更改PropertyChanged的值时调用方法,只需在属性设置器中执行此操作即可。

DataObj

如果您只是替换private JObject _dataObj; public JObject DataObj { get { return _dataObj; } set { if (_dataObj != value) { _dataObj = value; OnDataObjChanged(); // Maybe you don't really need this, I can't say. //OnPropertyChanged(nameof(DataObj)); } } } protected async void OnDataObjChanged() { await dataBox.Dispatcher.RunAsync( Windows.UI.Core.CoreDispatcherPriority.Normal, delegate { _dataBox.Text = writeString; } ); } 的值,则dataObj的旧值不会引发任何事件。为什么会这样?怎么可能呢?

答案 1 :(得分:1)

永远不会引发DataObj_PropertyChanged的原因是因为您没有将该方法附加到那个已更改的实例

您的代码类似于

JObject dataObj;

// Create a new JObject instance from a jsonString
dataObj = JObject.Parse( jsonString );
dataObj.PropertyChanged += DataObj_PropertyChanged;

// Create a new JObject instance from a jsonString
dataObj = JObject.Parse( jsonString );
如果您更改了附加了实例的属性,则会调用

DataObj_PropertyChanged。但是,您创建了一个没有附加DataObj_PropertyChanged的新实例。