我有一种情况需要拦截WPF尝试设置绑定到文本框的属性的值,并更改实际存储的值。基本上,我允许用户在TextBox中输入复杂的值,但会自动将其解析为组件。
一切正常,但我无法刷新UI并向用户显示新计算的值。
查看模型
public class MainViewModel : INotifyPropertyChanged
{
private string serverName = string.Empty;
public event PropertyChangedEventHandler PropertyChanged;
public string ServerName
{
get
{
return this.serverName;
}
set
{
this.serverNameChanged(value);
}
}
private void NotifyPropertyChanged(String propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
private void serverNameChanged(string value)
{
if (Uri.IsWellFormedUriString(value, UriKind.Absolute))
{
var uri = new Uri(value);
this.serverName = uri.Host;
this.NotifyPropertyChanged("ServerName");
// Set other fields and notify of property changes here...
}
}
}
查看
<TextBox Text="{Binding ServerName}" />
当用户键/粘贴/等。在“服务器名称”文本框和选项卡中输出完整的URL,运行视图模型代码并正确设置视图模型中的所有字段。绑定到UI的所有其他字段都会刷新并显示。但是,即使ServerName
属性返回正确的值,屏幕上显示的Text
也是旧值。
有没有办法强制WPF获取我的新属性值并在“源属性更改”过程中刷新显示?
注意:
我还尝试将ServerName
作为DependencyProperty
并在实际PropertyChangedCallback
中完成工作,但结果完全相同。
答案 0 :(得分:0)
正如Bill Zhang所指出的,实现这一目标的方法是通过调度员运行NotifyPropertyChanged
;这会导致事件在当前事件结束后运行,并正确更新显示。
Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() =>
this.NotifyPropertyChanged("ServerName")))