在下面的示例中,我们将 ViewModel 绑定到具有一个名为 Message 的单个属性的视图。 此属性绑定到具有双向绑定的文本框。 对于此测试,我们将在二传手中进行一些价值胁迫,并再次更改属性。
在 Silverlight 4 中,这非常有效。 如果消息属性在属性库中发生更改,文本框将看到新值。 例如,在文本框中键入"A"并失去焦点将导致 Aaa
然而,在Silverlight 5中,这似乎被破坏/改变了。 在资源库中修改值后,永远不会命中吸气器。 在两者之间添加 IValueConverter,表明 Convert/ConvertBack 方法永远不会命中。 版本4和版本5之间似乎发生了一些根本性的变化。有什么变化吗? 这是一个错误吗?
public class ViewModel : INotifyPropertyChanged
{
private string _message;
public event PropertyChangedEventHandler PropertyChanged;
public string Message
{
get
{
return _message;
}
set
{
_message = value;
this.RaisePropertyChanged();
if (_message.Length < 10)
{
_message = _message.PadRight(10, 'a');
this.RaisePropertyChanged();
}
}
}
private void RaisePropertyChanged()
{
var handler = this.PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs("Message"));
}
}
}
此问题有几个解决方法,这似乎是 Silverlight 5 绑定调试功能中的一个错误(请参阅 Booysen 的答案@Ray)。
首先,重要的是要知道这不是生产中的问题,而只是在调试应用程序时发生的问题。因此,解决方法实际上只是在调试环境中重现生产行为(尽管禁用了一些调试功能)。
第一个解决方法是使用绑定类中名为 IsDebuggingEnabled 的静态(在 VB.Net 中共享)字段禁用绑定调试。那里的文档提供了以下建议。
在应用程序类构造函数中将此字段设置为 false
注意:此更改不能限制为单个绑定,而是会影响应用程序中的所有绑定。
第二种方法是在承载 Silverlight 应用程序的 Web 项目的项目属性中禁用 Silverlight 调试器。使用以下步骤进行此更改。
- 在"解决方案资源管理器"中右键单击 Web 项目,然后选择"属性"。
- 选择"网页"选项卡。
- 向下滚动到"调试器"部分。
- 取消选中标记为 Silverlight 的复选框。
注意: 此更改不仅禁用应用程序的绑定调试,还禁用常规 Silverlight 调试。但是,可以启用其他调试器。
这已被Microsoft确认为 Silverlight 5 中的一个错误。它仅在调试模式下发生,因此适用于发布模式。
如果禁用 XAML 绑定调试,则问题将消失。
Binding.IsDebuggingEnabled = false;