1

我正在处理文本框所需的 TimeSpan 值。输入内容需要经过验证,并且可能采用多种不同的格式(例如 1300 表示 13:00)。我做了一些工作来检查并在视图模型中转换它。但在那之后我如何刷新文本框中的文本?

<TextBox Text="{Binding Path= OpenHourFromText, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnExceptions=True}" ></TextBox>

OpenHourFromValue 是我用于验证和数据绑定的字符串属性

    public class MainPageViewModel : NotificationObject{
        public string OpenHourFromText
                {
                    get
                    {
    //OpenHourFrom is a TimeSpan property that contain the value
                        if (OpenHourFrom != null)
                        {
                            return GetOpeningHourText(OpenHourFrom); //fomat the time
                        }
                        else
                        {
                            return "";
                        }
                    }
                    set
                    {
//do validation and convert here. 1300 will be changed to 13:00 TimeSpan type
                        OpenHourFrom = ConvertToTimeSpan(value);  
                        RaisePropertyChanged("OpenHourFromText");
                    }
                }

        public TimeSpan OpenHourFrom { get; set; }

}

视图模型继承自 Microsoft.Practices.Prism.ViewModel.NotificationObject

在文本框中输入 1300 后,OpenHourFrom 会更新。但是文本框的文本没有更改为 13:00。为什么?请帮忙,谢谢。

4

2 回答 2

1

您正在为 property 发出 PropertyChange 通知UpdateTimeText,而您的实际属性名称是OpenHourFromText

更改您的PropertyChange通知以引发正确属性的通知,它应该会为您更新。

于 2012-10-22T16:28:37.017 回答
1

当 TextBox 设置某个值时,它不会调用 get。解决此问题的方法可能类似于将 RaisePropertyChanged("OpenHourFromText") 替换为 Dispatcher.BeginInvoke(() => RaisePropertyChanged("OpenHourFromText"));它会延迟触发该事件.

set 
   { 
    //do validation and convert here. 1300 will be changed to 13:00 TimeSpan type 
     OpenHourFrom = ConvertToTimeSpan(value);                                            
     Dispatcher.BeginInvoke(() => RaisePropertyChanged("OpenHourFromText"));
   }
于 2012-10-23T14:38:46.260 回答