2017-04-21 96 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的新實例。