2011-05-27 120 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