1

私のビューでは、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");
    }
}

ユーザーが double に解析されない何かを入力すると、Model.Temperature プロパティが 0 に設定され、TextBox も 0 に変更したいと思います。OnPropertyChanged イベントがそれを処理すると思いました。何が起こっているのですか?

4

1 に答える 1

1

編集:これは、テキストが 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}"/>

旧: バインディングで双方向バインディングが許可されていることを確認してください。これがないと、TextBlock の TextProperty を設定できません。

<TextBlock Text="{Binding Temperature, Mode=TwoWay}"/>
于 2012-09-13T15:24:45.107 に答える