Silverlight绑定问题到嵌套的ViewModel类

时间:2011-05-27 02:25:30

标签: wpf silverlight binding

TextBlock具有以下绑定:

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

DataContext在SL app构造函数

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

现在我处于调查员模式,所以我从文本中删除了所有DataContext,因此这是当前整个项目中唯一的一个。

我的ViewModel类实现了INotifyPropertyChanged接口,并且属性Sum存在。

如果我将public int Sum更改为public int SumDOESNTEXIST并启动SL应用程序,则会收到找不到属性Sum的错误,因此绑定在某种程度上有效。

NotifyPropertyChanged("Sum");会在需要时被解雇

然而,正如我在我的基本代码中发现VM if后的结果为false,所以没有人订阅Event。

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

结果Sum属性被更新,但TextBlock没有表明。

我做错了什么?

编辑:我正在使用OneWay绑定(但是TwoWay并没有改变任何内容)因为我只需要在source属性发生变化时更新textBlock属性。(单向绑定的定义)

至于DataContext,我在这里添加了一个相当直接的检查:

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

显示了MessageBox ..

如果DataContext设置为INotifyPropertyChanged接口实现我相信应该是PropertyChanged事件的订阅者吗?在我的情况下,他们不在。

2 个答案:

答案 0 :(得分:0)

同样,我建议您发布所有代码。有点奇怪,因为你似乎在设置你的命名标签的datacontext,这在你发布的内容中不存在。

无论如何,我认为你将dataContext与绑定路径混淆(看起来你可能正在使用它们)。您的视图的 dataContext应设置为您的INotifyPropertyChanged对象(通常是viewModel),并且您的文本块应绑定到通知属性(在这种情况下为Sum或ChipsSum)。

答案 1 :(得分: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之后,我能够看到一个接一个地弹出2个消息框

MyApp.TestVmNest + TestClassVMsubscribed MyApp.TestVmNest + TestClassVMUNSUBSCRIBED

我能够使用以下类替换结构重现这种行为

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

我原来的viewModel类是内部&amp;内部嵌套,但对于简单的类,我在应用程序启动时没有MSG BOXES所以不知道为什么会出现这种情况

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

我不知道为什么这个公共内部嵌套类被添加为PropertyChanged,通过绑定引擎检查它是否有Sum字段,但之后很快被删除,从未实际绑定。

所以它必须是公众才能正常工作才会出现..