0

我会尽量保持简洁。

我遇到了一个问题,我有一个带有 3 个单选按钮的双向数据绑定。我的问题是,一旦我更改了选择的单选按钮,我就会得到一种周期性的变化。那么发生了什么,我更改了更改源数据属性的单选按钮,但源数据属性更改了绑定的其他 2 个属性,这反过来又更改了其他单选按钮,这些单选按钮也会调用这些属性的 PropertyChange 函数. 如何修复它,以便 PropertyChange 每个单选按钮开关只发生一次。

属性更改事件处理程序:

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 没有更改,则不要调用它。
一般来说,这是一个很好的做法。

其次(仅当第一个不起作用时)将每个按钮放在一个单独的组中,这样它们就不会互相调用,也不会在后面的代码中将其他按钮设置为 false。

于 2014-12-04T15:41:46.263 回答