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事件的订阅者吗?在我的情况下,他们不在。
答案 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
字段,但之后很快被删除,从未实际绑定。
所以它必须是公众才能正常工作才会出现..