【发布时间】:2012-08-14 08:51:27
【问题描述】:
我是 Silverlight 新手,我无法让简单的 Silverlight 绑定示例工作!
我需要创建一个视图模型,在加载时显示列表中的文档数量。
我创建了一个基类,它实现了 INotifyPropertyChanged:
public abstract class BaseViewModel : INotifyPropertyChanged {
protected BaseViewModel() {}
#region INotifyPropertyChanged Members
protected void OnPropertyChanged(string propertyName) {
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
我创建了一个具有“CountDocs”属性的子类:
public class DocumentViewModel : BaseViewModel {
public DocumentViewModel () {
...
}
...
public int CountDocs {
get { return countDocs; }
set {
if (countDocs != value) {
countDocs = value;
OnPropertyChanged("CountDocs");
}
}
}
public int countDocs;
}
我的 DocumentViewModel.xaml 包含以下内容:
<UserControl
...
xmlns:vm="clr-namespace: ... .ViewModels" >
...
<UserControl.Resources>
<vm:DocumentViewModel x:Key="viewModel"/>
</UserControl.Resources>
...
<TextBlock x:Name="CounterTextBlock" Text="{Binding Source={StaticResource viewModel}, Path=CountDocs}"></TextBlock>
那是我提到了我的子类的命名空间,我用键“viewModel”创建了我的子类的资源,并输入了文本块的绑定,到这个对象的属性“CountDocs”。
问题在于 CountDocs 属性仅填充 TextBlock 一次:加载时。但后来我设置了 CountDocs,它并没有填充 TextBlock。
我尝试过使用绑定的Mode属性,来使用DataContext,但还是不行。
绑定有问题吗?当我的对象的 CountDocs 属性更改时,如何使 ViewModel 更新?
谢谢
【问题讨论】:
-
您是否检查过它是否通过了
handler != null条件并引发了事件? -
VS 中的“输出”窗口会显示绑定失败。我必须查看更多代码,但可能的远程诊断是您不小心创建了多个
DocumentViewModel实例。 -
您是否尝试在另一个线程上设置新值?任何 UI 属性更新都必须在 UI 线程上进行(例如,您需要使用调度程序将它们传递给 UI 线程)。如果是这样,下面为您提供可能的答案。
-
@herzmeister:我想你是对的,因为有两个构造函数:默认和带参数。删除带参数的构造函数会导致错误。需要什么样的代码?我怎么能创建几个对象?这是一个常见的错误吗?
-
用你的调试器在构造函数中放置一个断点,看看它在哪里被实例化。也许您使用的框架会自动连接视图模型并将您的视图绑定到错误的实例,或者您不小心在其他地方留下了一段代码。
标签: silverlight binding