在Silverlight中使用MVVM,在我的视图中我有:
<TextBox Text="{Binding Path=Temperature,Mode=TwoWay}" />
MyViewModel具有:
public MyModel Model {get{...}set{...}}//In my code I do have the property changed events for this
public string Temperature
{
get
{
return Model.Temperature.ToString();
}
set
{
double test;
if(double.TryParse(value, out test))
{
Model.Temperature = test;
}
else
{
Model.Temperature = 0D;
}
}
}
void Model_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
switch(e.PropertyName)
{
case "Temperature":
OnPropertyChanged("Temperature");
break;
}
}
MyModel有:
private double _temperature;
public double Temperature
{
get
{
return _temperature;
}
set
{
_temperature = value; OnPropertyChanged("Temperature");
}
}
如果用户输入的内容无法解析为双精度,则Model.Temperature属性将设置为0,我希望TextBox也更改为0。我认为OnPropertyChanged事件会解决这个问题。你知道发生了什么事吗?
编辑:这是因为Text在调用设置期间不会调用get。这可能会导致一个糟糕的无限循环。你有几个选择。
延迟激发属性因错误条件而更改:
public string Temperature
{
get { return Model.Temperature.ToString(); }
set
{
double test;
if (double.TryParse(value, out test))
{
Model.Temperature = test;
}
else
{
Model.Temperature = 0D;
Deployment.Current.Dispatcher.BeginInvoke(() => OnPropertyChanged("Temperature"));
}
}
}
使用NumericTextBox
在ViewModel上实现IDataErrorInfo,并将TextBox上的ValidatesDataErrors设置为真正的
<TextBox Text="{Binding Temperature, Mode=TwoWay, ValidatesOnDataErrors=True}"/>
旧的:确保您的绑定允许双向绑定。没有它,就无法设置TextBlock的TextProperty。
<TextBlock Text="{Binding Temperature, Mode=TwoWay}"/>