Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在绑定属性设置器中更改输入的文本框文本?_C#_Silverlight_Data Binding_Mvvm_Inotifypropertychanged - Fatal编程技术网

C# 如何在绑定属性设置器中更改输入的文本框文本?

C# 如何在绑定属性设置器中更改输入的文本框文本?,c#,silverlight,data-binding,mvvm,inotifypropertychanged,C#,Silverlight,Data Binding,Mvvm,Inotifypropertychanged,在Silverlight中使用MVVM,我认为: <TextBox Text="{Binding Path=Temperature,Mode=TwoWay}" /> MyModel有: public MyModel Model {get{...}set{...}}//In my code I do have the property changed events for this public string Temperature { get { r

在Silverlight中使用MVVM,我认为:

<TextBox Text="{Binding Path=Temperature,Mode=TwoWay}" />
MyModel有:

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;
    }
}
private double _temperature;
public double Temperature
{
    get
    {
        return _temperature;
    }
    set
    {
        _temperature = value; OnPropertyChanged("Temperature");
    }
}
如果用户输入的内容不能解析为double,Model.Temperature属性将设置为0,我希望文本框也更改为0。我以为OnPropertyChanged事件会解决这个问题。有什么想法吗?

编辑: 这是因为在调用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"));
        }
    }
}
使用

在ViewModel上实现,并将文本框上的ValidateSondaErrors设置为true

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

旧的: 请确保您的绑定允许。如果没有它,则无法设置TextBlock的TextProperty

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

编辑: 这是因为在调用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"));
        }
    }
}
使用

在ViewModel上实现,并将文本框上的ValidateSondaErrors设置为true

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

旧的: 请确保您的绑定允许。如果没有它,则无法设置TextBlock的TextProperty

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


我已经有了这个,正如我在帖子中的代码示例所包含的。对不起,我没有看到那个部分。更新了我的回答delay和IDataErrorInfo看起来都很有希望,我查看了各种数字文本框,但没有完全售出。如果归结到这一点,我想我会尝试把它作为最后的手段。将用户输入限制为只输入数字是一件非常常见的事情,[大多数]用户都知道他们不能为自己的年龄输入“p”。嗯,这是一个很好的观点。我想我可能把事情复杂化了。我仍然倾向于尽可能多地防止意外事件。正如我在文章中的代码示例中所包含的,我已经有了这一点。对不起,我没有看到这一部分。更新了我的回答delay和IDataErrorInfo看起来都很有希望,我查看了各种数字文本框,但没有完全售出。如果归结到这一点,我想我会尝试把它作为最后的手段。将用户输入限制为只输入数字是一件非常常见的事情,[大多数]用户都知道他们不能为自己的年龄输入“p”。嗯,这是一个很好的观点。我想我可能把事情复杂化了。我仍然倾向于尽可能多地预防意外事件。@ChrisW。是的,在模型中调用OnPropertyChanged,ViewModel将捕获它并为视图模型调用它。@ChrisW。是的,OnPropertyChanged在模型中被调用,ViewModel捕获它并为视图模型调用它。