在Silverlight 5中强制属性设置器的值

6
在下面的示例中,我们将ViewModel绑定到一个具有名为Message的单个属性的视图。该属性绑定到具有双向绑定的TextBox。对于此测试,我们在setter中进行了一些值强制,并再次引发了属性更改。
在Silverlight 4中,这完美地工作。如果消息属性在属性setter中更改,则文本框将看到新值。例如,在文本框中键入“A”并失去焦点会导致Aaaaaaaaaaa出现,因为值已更改。
然而,在Silverlight 5中,这似乎被破坏/更改了。在值在setter中修改后,getter永远不会被触发。在中间添加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"));
        }
    }
}
2个回答

3
这个问题有几个解决方法,这似乎是Silverlight 5绑定调试功能中的一个错误(请参见@Ray Booysen的回答)。
首先需要知道的是,这不是一个生产问题,而是仅在调试应用程序时发生。因此,这些解决方法只是在调试环境下重现生产行为(尽管某些调试功能已被禁用)。
第一个解决方法是使用名为IsDebuggingEnabled的静态(在VB.Net中共享)字段,在Binding类中禁用绑定调试。文档中提供了以下建议。

在应用程序类构造函数中将此字段设置为false

注意:这个更改不能局限于单个绑定,而是会影响应用程序中的所有绑定。
第二个解决方法是在托管Silverlight应用程序的Web项目的项目属性中禁用Silverlight调试器。使用以下步骤进行更改。
  1. 在解决方案资源管理器中右键单击Web项目并选择“属性”。
  2. 选择“Web”选项卡。
  3. 向下滚动到“调试器”部分。
  4. 取消选中标记为Silverlight的复选框。
注意:这个更改不仅禁用应用程序的绑定调试,还禁用了一般的Silverlight调试。但是可以启用其他调试器。

1
微软确认这是 Silverlight 5 的一个bug。它只会在调试模式下出现,所以在发布模式下不会出现问题。
如果您禁用XAML绑定调试,该问题将被解决。
Binding.IsDebuggingEnabled = false; 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接