2017-04-21 91 views
0

我在C#中使用JSON.NET。在我的代码中,Json字符串被定期解析为JObject dataObj。每当dataObj被更改时,我都希望新的一个显示在UI中的文本框中。这就是为什么我认为这个代码:为什么JObject.Parse()不能调用PropertyChanged?

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转换dataObj

我预计DataObj_PropertyChanged()每次执行,行dataObj = JObject.Parse(jsonString);达成,但事实并非如此。

我该如何解决这个问题?有其他选择吗?

谢谢。

+0

你问我们为什么你的'dataObj'字段或属性在你赋值的时候不会引发'PropertyChanged',是吗?那么,你已经看到了代码,我们没有。你告诉我们。但是我可以告诉你一件事:如果您替换'dataObj'的值,那么不会使旧值引发任何事件。 –

+0

@SirRufo阅读我的整个评论。 –

+1

@EdPlunkett经过三次阅读,我得到它:o) –

回答

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的价值,dataObj旧值不会引发任何事件。为什么呢?它怎么可能?

+1

您的解释是正确的,我只是没有看到最明显的解决方案。谢谢:D – Nayangar

+0

@Nayangar很高兴听到它! –

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的新实例。