Windows窗体radiobutton数据绑定

时间:2010-02-15 16:33:03

标签: winforms data-binding radio-button

我正在遵循presentation model建议的Martin Fowler设计模式,用于Windows窗体项目中的GUI架构。

表示模型的本质是一个完全自包含的类,它表示UI窗口的所有数据和行为,但没有任何用于在屏幕上呈现该UI的控件。然后简单地将演示模型的状态投射到玻璃上......“ - Martin Fowler

我发现这个概念非常流畅且易于理解,除了这一个数据将RadioButtons绑定到Data / Domain对象上的属性的问题。

假设我有一个带有三个单选按钮的Windows窗体,将某些“模式”选项描述为 -

  • 自动
  • 手册
  • 导入

如何在数据/域对象上使用布尔属性到DataBind这些按钮?我尝试了很多方法但无济于事。例如,我想代码 -

rbtnAutoMode.DataBindings.Add("Text", myBusinessObject, "IsAutoMode");
rbtnManualMode.DataBindings.Add("Text", myBusinessObject, "IsManualMode");
rbtnImportMode.DataBindings.Add("Text", myBusinessObject, "IsImportMode");

数据/域对象上应该有第四个属性,如“SelectedMode”,最后应该描述单个值,如“SelectedMode = Auto”。我正在尝试更改任何“IsAutoMode”,“IsManualMode”或“IsImportMode”时更新此属性,例如通过财产安置者。我在我的数据/域对象上实现了INotifyPropertyChanged,因此更新任何数据/域对象属性会自动更新我的UI控件,这不是问题。

在Stack Overflow问题 How do I use databinding with Windows Forms radio buttons? 中绑定两个单选按钮有一个很好的例子,但我在使用三个按钮实现相同时错过了链接。我对单选按钮的行为非常不稳定。

我希望我能够合理地解释它。我实际上很着急,无法在帖子上提供详细的代码,但是对此方面的任何帮助表示赞赏。

通过公开像

这样的方法,可以解决这个问题
public void SetMode(Modes mode)
{
  this._selectedMode = mode;
}

可以从UI的单选按钮的“CheckedChanged”事件中调用,并且可以在业务对象上完美地设置“SelectedMode”,但我需要扩展限制以验证是否可以通过DataBinding完成此操作。

1 个答案:

答案 0 :(得分:6)

我的域/业务模型类包含“模式”属性,其类型为“字符串”。对于AUTO / MANUAL / IMPORT模式,Mode属性应分别包含“A”/“M”/“I”。我的Presentation Model类通过Presentation Model中的构造函数接收我的域模型。

我的Presentation Model类包含三个布尔变量 “IsAutoMode”,“IsManualMode”,“IsImportMode”。这些布尔变量将用于DataBinding Form上的单选按钮。这些布尔属性的GET / SET稍微扩展,以处理更新域模型中的相应属性(“模式”)。请注意下面的演示模型类中的属性GET / SET代码 -

    public bool IsAutoMode
    {
        get
        {
            return _domainModel.Mode.ToUpper() == "A";
        }
        set
        {
            _domainModel.Mode = (value == true) ? "A" : _domainModel.Mode;
        }
    }
    public bool IsManualMode
    {
        get
        {
            return _domainModel.Mode.ToUpper() == "M";
        }
        set
        {
            _domainModel.Mode = (value == true) ? "M" : _domainModel.Mode;
        }
    }
    public bool IsImportMode
    {
        get
        {
            return _domainModel.Mode.ToUpper() == "I";
        }
        set
        {
            _domainModel.Mode = (value == true) ? "I" : _domainModel.Mode;
        }
    }

现在,一旦在您的演示模型类中设置了这些布尔属性,您就可以轻松地在窗体上对单选按钮控件进行数据绑定,如下所示

rbtnAutoMode.DataBindings.Add("Checked", _pmodel, "IsAutoMode");
rbtnManualMode.DataBindings.Add("Checked", _pmodel, "IsManualMode");
rbtnImportMode.DataBindings.Add("Checked", _pmodel, "IsImportMode");

并看到你的单选按钮数据绑定飞。无论您想在域模型中保留什么类型的属性,当前示例都有效,无论是“字符串”,“布尔”,还是其他任何内容。关键是依靠 -

get
{
  return _domainModel.Mode.ToUpper() == <corresponding domain property val>;
}

在属性GET中而不是返回本地字段值,并且在域模型中设置任何值,以防属性SET中的“值”不为TRUE,否则让域模型具有其当前值< / p>

set
{
  _domainModel.Mode = (value == true) ? <domain property to set> : _domainModel.Mode;
}

另一个重要的一点是,这种类型的radiobutton数据绑定仅在Binding.DataSourceUpdateMode设置为OnValidation时才有效。如果更改为OnPropertyChanged属性的事件触发序列,则从一个按钮切换到另一个按钮时,其行为方式会阻止评估控件移动到的按钮的正确属性值。但是DataSourceUpdateMode在普通应用程序中几乎没有改变,因此幸运的是,这适用于大多数具有两个或更多无线电按钮的应用程序。

(我看到这个问题得到了很好的观点但是还没有发布答案。所以我认为我应该分享我最终解决的问题。)