Property Setter中的Coerce Value - Silverlight 5

时间:2012-08-15 07:16:33

标签: silverlight data-binding

在下面的示例中,我们将ViewModel绑定到一个名为Message的属性的视图。此属性绑定到具有双向绑定的TextBox。对于这个测试,我们在setter中做了一些价值强制,并且再次改变了属性。

在Silverlight 4中,这非常有效。如果在属性设置器中更改了消息属性,则文本框将看到新值。例如。在文本框中键入“A”并失去焦点会导致Aaaaaaaaaa出现,因为值已更改。

然而,在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 个答案:

答案 0 :(得分:3)

此问题有几种解决方法,似乎是Silverlight 5的绑定调试功能中的一个错误(请参阅@Ray Booysen的回答)。

首先,重要的是要知道这不是生产中的问题,而是在调试应用程序时只发生。因此,解决方法实际上只是为了在调试环境中重现生产行为(尽管已禁用某些调试功能)。

第一个解决方法是使用IsDebuggingEnabled类中名为Binding的静态(在VB.Net中共享)字段禁用绑定调试。那里的文档提供了以下建议。

  

在应用程序类构造函数

中将此字段设置为false

注意:此更改不能仅限于单个绑定,而是会影响应用程序中的所有绑定。

第二种是在托管Silverlight应用程序的Web项目的项目属性中禁用Silverlight调试器。使用以下步骤进行此更改。

  1. 在解决方案资源管理器中右键单击Web项目,然后选择“属性”。
  2. 选择“Web”选项卡。
  3. 向下滚动到“调试器”部分。
  4. 取消选中标有Silverlight的复选框。
  5. 注意:此更改不仅会禁用应用程序的绑定调试,还会禁用常规Silverlight调试。但是,可以启用其他调试器。

答案 1 :(得分:1)

这已被Microsoft确认为Silverlight 5中的错误。它只发生在调试模式下,因此适用于发布模式。

如果禁用XAML绑定调试,则问题就消失了。

Binding.IsDebuggingEnabled = false;