2011-05-27 47 views
-1

一個TextBlock具有以下綁定:Silverlight的結合問題嵌套ViewModel類

<TextBlock Text="{Binding Path=Sum, FallbackValue=9999}"></TextBlock> 

的DataContext在SL應用程序的構造函數設置

ViewModelClass viewModelObject=new ViewModelClass(); 
public Calculator() 
     { .... 
DataContext=viewModelObject; 
} 

現在IM在調查模式,所以我刪除了所有的DataContext OCCURENCES從文本,所以這是目前唯一的整個項目。

我的ViewModel類實現INotifyPropertyChanged接口和屬性Sum存在。

如果我將public int Sum更改爲public int SumDOESNTEXIST並啓動SL應用程序,我收到一個錯誤,指出找不到屬性Sum,因此綁定在某種程度上起作用。

NotifyPropertyChanged("Sum");在需要的地方

但是正如我在VM我的基本代碼發現了以下if結果爲假觸發,所以沒有人訂閱了事件。

protected void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 

結果Sum屬性被更新,但TextBlock沒有指出。

我在做什麼錯?

編輯:我使用的單向綁定(但雙向不會改變任何東西僅供參考),因爲我需要更新的文本塊屬性僅當源屬性發生變化(單向綁定的定義)

至於DataContext的,我在這裏增加了一個相當直接的檢查:

internal void sum_Changed(object sender, TextChangedEventArgs e) 
{ 
    if(mySadLabel.DataContext== viewModelObject) 
     MessageBox.Show("correct"); 
    NotifyPropertyChanged("Sum"); 
} 

的MessageBox顯示..

如果DataContext設置INotifyPropertyChanged接口實現我相信有應該是PropertyChanged事件的訂閱者?在我的情況下,他們缺席。

+0

你是正確的,你有正確的模式。 – 2011-05-27 02:41:07

+0

鼓舞人心的,但不工作!事件爲空,沒有人有興趣更新它可能會觸發.. – 2011-05-27 02:42:44

+0

您是否使用特定的mvvm框架? – 2011-05-27 02:43:16

回答

0

找出問題出在ViewModel定義中。

後,我加入手動控制PropertyChanged事件

private PropertyChangedEventHandler m_PropertyChangedHand; 

    public event PropertyChangedEventHandler PropertyChanged 
    { 
     add 
     { 
      MessageBox.Show(GetType() + "subscribed"); 
      m_PropertyChangedHand = (PropertyChangedEventHandler)Delegate.Combine(m_PropertyChangedHand, value); 
     } 
     remove 
     { 
      MessageBox.Show(GetType() + "UNSUBSCRIBED"); 
      m_PropertyChangedHand = (PropertyChangedEventHandler)Delegate.Remove(m_PropertyChangedHand, value); 
     } 
    } 

我能看到DataContext設置

MyApp.TestVmNest + TestClassVMsubscribed MyApp的後2個消息框彈出了一個又一個的權利。TestVmNest + TestClassVMUNSUBSCRIBED

我能夠再現與下面的類替代結構這樣的行爲

public class TestVmNest 
    { 
     internal class TestClassVM : Observable 
     { 
      public int Sum 
      { 
       get { return 1337; } 
      } 
     } 
    } 

但是我原來的ViewModel類是內部&內部嵌套太多,但對於簡單的類一樣,我沒有得到任何味精BOXES AT ALL當應用程序被啓動,以便不知道爲什麼,可能是這種情況

internal class TestVmNest 
    { 
     internal class TestClassVM : Observable 
     { 
      public int Sum 
      { 
       get { return 1337; } 
      } 
     } 
    } 

我不知道爲什麼這次公開內部嵌套類被添加的PropertyChanged,檢查其^ h作爲Sum字段通過綁定引擎,但後來很快被移除,從未實際綁定。

所以它必須是公衆公開,以便正確地似乎工作..

+0

很高興你有它工作! – 2011-05-27 04:23:16

0

同樣,我建議你發佈你的所有代碼。有些東西很奇怪,因爲您似乎正在設置您的已命名標籤的datacontext,這在您發佈的內容中並不存在。

在任何情況下,我認爲你是混淆dataContext與綁定路徑(看起來你可能會使用兩者)。您的視圖的 dataContext應該設置爲您的INotifyPropertyChanged對象(通常爲viewModel),並且您的文本塊應該綁定到通知屬性(在這種情況下爲Sum或ChipsSum)。

+0

Ya發佈了儘可能多的視圖和vm,以及完整的代碼。如果有的話。 – 2011-05-27 03:11:54

+0

你可以看到我沒有設置標籤,我正在使用==進行嚴格檢查,將其設置爲父級控件(我的整個應用程序)的確將其設置給它的子項(我的標籤),我想也許那裏是一個方式標籤沒有繼承它在某些時候,但它的設置正確。至於代碼..我不知道要添加什麼人!這個綁定的整個責任鏈在最初的後期。我知道它應該工作,各種檢查表明,一切都設置正確,可能是VM沒有訂戶,但用作DataContext的原因是什麼?沒有已知的? – 2011-05-27 03:12:11

+0

我看到你在ctor中做什麼,但什麼是viewModelObject?類型,範圍,不能說。 – 2011-05-27 03:15:29