2

1 つのフォーム、いくつかのコントロール、および次のように定義されたビジネス オブジェクトを含む単純な winforms アプリがあります。

public class BusinessObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, e);
        }
    }

    private string _phoneNumber;
    public string PhoneNumber
    {
        get { return _phoneNumber; }
        set
        {
            if (_phoneNumber == value)
            {
                return;
            }

            _phoneNumber = value;
            OnPropertyChanged(new PropertyChangedEventArgs("PhoneNumber"));
        }
    }

私のフォームには、バインディング ソースを介して PhoneNumber プロパティにバインドされたテキスト ボックスがあり、データ ソースの更新モードは OnPropertyChanged に設定されています。これはすべて期待どおりに機能します。ビジネス オブジェクトの PhoneNumber プロパティにテキストを割り当てる前に、テキストを検証する必要があります。テキスト ボックスの Validating イベント ハンドラーでこれを行うと考え、入力が無効な場合は、エラー プロバイダーを表示し、e.Cancel = true に設定します。残念ながら、これは無効な入力が PhoneNumber プロパティにバインドされるのを防ぎません。これを行う簡単な方法はありますか?

4

3 に答える 3

1

mrlucmorin が提案したように、更新データ ソース モードを "OnPropertyChanged" から "OnValidation" に変更して、テキスト ボックスが失われて検証されたときにのみバインディングが発生するようにしました。テキストボックスの Validating() イベントハンドラーに検証を実装し、データが無効な場合は e.Cancel = true に設定しました。残念ながら、ツールバーのボタンをクリックしてもテキストボックスのフォーカスが失われるようには見えないため、 Validating() イベントは発生しませんが、ツールバーのボタンがクリックされたときに ValidateChildren() を呼び出すことで回避できました。最終的に私の問題を解決してくれた提案について、mrlucmorin と ImGreg に再び感謝します!

于 2012-04-09T13:05:28.900 に答える
1

データ検証はまさにあなたが探しているものかもしれません. 無効な入力がオブジェクトを変更しないようにする必要があります。

于 2012-04-04T19:21:23.420 に答える
0

msdnによると、使用しているイベントは値が変更された後に発生しています。1 つのオプションは、データのバックアップを保存し、変更された値を復元することです。ただし、これは理想的なアプローチではありません。

コントロールの検証方法を変更します。

コードの動作に依存するため、いつこれを行うべきかはわかりません。テキスト ボックス コントロールにフォーカスを失ったときに独自の検証を実行したり、データソースが更新されるときに検証を実行したりすることがあります。

編集:おそらく、 ErrorProvider Classを探しています。これは、必要に応じて検証を処理するために使用できます。

于 2012-04-04T19:19:12.903 に答える