【问题标题】:How to change entered TextBox text in binded property setter?如何在绑定属性设置器中更改输入的 TextBox 文本?
【发布时间】:2012-09-06 16:08:22
【问题描述】:

在 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 事件会解决这个问题。有什么想法吗?

【问题讨论】:

  • @ChrisW。是的,OnPropertyChanged 在 Model 中被调用,ViewModel 捕获它并为 View Model 调用它。

标签: c# silverlight data-binding mvvm inotifypropertychanged


【解决方案1】:

编辑: 这是因为 Text 在调用 set 期间不会调用 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 上的 ValidatesOnDataErrors 设置为 true

<TextBox Text="{Binding Temperature, Mode=TwoWay, ValidatesOnDataErrors=True}"/>

旧: 确保您的绑定允许two way binding。没有它,您将无法设置 TextBlock 的 TextProperty。

<TextBlock Text="{Binding Temperature, Mode=TwoWay}"/>

【讨论】:

  • 我已经有了这个,包含在我的代码示例中。
  • 抱歉,没看到那部分。更新了我的答案
  • 延迟和 IDataErrorInfo 看起来都很有前途,我查看了各种数字文本框,但没有完全出售。如果归根结底,我想我会尝试作为最后的手段。
  • 将用户输入限制为仅数字是很常见的事情,[大多数]用户都明白他们不能输入年龄的“p”
  • 嗯,这是一个很好的观点。我想我可能过于复杂了。我仍然倾向于尽可能多地避免意外事件。
猜你喜欢
  • 2015-11-11
  • 2011-04-29
  • 1970-01-01
  • 2019-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
相关资源
最近更新 更多