0

これをできるだけ簡潔に保つようにします。

3 つのラジオ ボタンを使用した双方向のデータ バインディングがあるという問題があります。私の問題は、選択したラジオボタンを変更するとすぐに、一種の周期的な変更が発生することです。何が起こっているのか、ソース データ プロパティを変更するラジオ ボタンを変更しますが、ソース データ プロパティは、バインドされている他の 2 つのプロパティを変更します。これにより、他のラジオ ボタンが変更され、それらのプロパティでも PropertyChange 関数が呼び出されます。 . PropertyChange がラジオ ボタン スイッチごとに 1 回だけ発生するように修正するにはどうすればよいですか。

プロパティ変更イベント ハンドラ:

public class SolutionOptions : INotifyPropertyChanged
{
    bool _direct;
    bool _iterative;
    bool _domain;
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }

    public bool Domain
    {
        get { return _domain; }
        set
        {
            if (_domain == value) return;

            _domain = value;
            OnPropertyChanged("Domain");
        }
    }

    public bool Iterative
    {
        get { return _iterative; }
        set
        {
            if (_iterative == value) return;

            _iterative = value;
            OnPropertyChanged("Iterative");
        }
    }

    public bool Direct
    {
        get { return _direct; }
        set
        {
            if (_direct == value) return;

            _direct = value;
            OnPropertyChanged("Direct");
        }
    }

データ バインディング コード:

 this.radioButton_DirectSolver.DataBindings.Add("Checked", _ssf, "SolOptions.Direct");
 this.radioButton_IterSolver.DataBindings.Add("Checked", _ssf, "SolOptions.Iterative");
 this.radioButton_DomainDecomp.DataBindings.Add("Checked", _ssf, "SolOptions.Domain");

フォーム画像:

ここに画像の説明を入力

4

1 に答える 1

0

まず、これをすべてのセッターに追加してみてください

if (_domain == value) return;

したがって、変更されない場合は OnPropertyChanged を呼び出さないでください。
これは一般的に良い方法です。

2 番目 (最初のボタンが機能しない場合のみ) は、各ボタンを個別のグループに配置して、互いに呼び出したり、コード ビハインドで他のボタンを false に設定したりしないようにします。

于 2014-12-04T15:41:46.263 に答える