Winforms Windows窗体radiobutton数据绑定

Winforms Windows窗体radiobutton数据绑定,winforms,data-binding,radio-button,Winforms,Data Binding,Radio Button,在Windows窗体项目中,我正在遵循建议的GUI体系结构设计模式 “表示模型的本质是一个完全自包含的类,该类表示UI窗口的所有数据和行为,但没有用于在屏幕上呈现该UI的任何控件。然后视图将表示模型的状态简单地投影到玻璃上…”Martin Fowler 我发现这个概念非常流畅且易于理解,除了数据绑定单选按钮到data/Domain对象上的属性这一问题 假设我有一个带有三个单选按钮的Windows窗体,将一些“模式”选项描述为- 自动的 手册 进口 如何使用数据/域对象上的布尔属性将数据绑定到

在Windows窗体项目中,我正在遵循建议的GUI体系结构设计模式

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

我发现这个概念非常流畅且易于理解,除了数据绑定单选按钮到data/Domain对象上的属性这一问题

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

  • 自动的
  • 手册
  • 进口
如何使用数据/域对象上的布尔属性将数据绑定到这些按钮?我试过很多方法,但都没有用。例如,我想编写如下代码-

rbtnAutoMode.DataBindings.Add("Text", myBusinessObject, "IsAutoMode");
rbtnManualMode.DataBindings.Add("Text", myBusinessObject, "IsManualMode");
rbtnImportMode.DataBindings.Add("Text", myBusinessObject, "IsImportMode");
data/domain对象上应该有第四个属性,如“SelectedMode”,该属性最后应该描述一个值,如“SelectedMode=Auto”。当“IsAutoMode”、“IsManualMode”或“IsImportMode”中的任何一个发生更改时(例如通过属性设置器),我尝试更新此属性。我已经在我的data/domain对象上实现了InotifyPropertyChange,因此,更新任何data/domain对象属性都会自动更新我的UI控件,这不是问题

在StackOverflow问题中有一个绑定两个单选按钮的好例子,但是我在用三个按钮实现相同的功能时缺少了链接。我对单选按钮有非常不稳定的行为

我希望我能合理地解释它。我实际上很忙,无法在帖子上写下详细的代码,但在此方面的任何帮助都是非常感谢的

对于这个问题,有一个简单的解决方案,方法是公开-

public void SetMode(Modes mode)
{
  this._selectedMode = mode;
}

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

我的域/业务模型类包含一个类型为“string”的“Mode”属性。对于自动/手动/导入模式,模式属性应分别包含“A”/“M”/“I”。我的表示模型类通过表示模型中的构造函数接收我的域模型

My Presentation Model类包含三个布尔变量,如下所示: “IsAutoMode”、“IsManualMode”、“IsImportMode”。这些布尔变量将用于数据绑定表单上的单选按钮。对这些布尔属性的GET/SET进行了一些扩展,以处理域模型中相应属性(“Mode”)的更新。请注意下面演示模型类中的属性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
{
返回_domainModel.Mode.ToUpper()=;
}
在属性中,获取而不是返回本地字段值,并且在属性集中的“值”不为TRUE的情况下,不在域模型中设置任何值,否则让域模型具有其当前值

set
{
  _domainModel.Mode = (value == true) ? <domain property to set> : _domainModel.Mode;
}
set
{
_domainModel.Mode=(值==true)?:\u domainModel.Mode;
}
另一个重要点是,这种类型的radiobutton数据绑定仅在
Binding.DataSourceUpdateMode
设置为
OnValidation
时有效,这是默认设置。如果更改为
OnPropertyChanged
,则当从一个按钮切换到另一个按钮时,属性的事件触发顺序的行为方式会阻止评估控件移动到的按钮的正确属性值。但是DataSourceUpdateMode在普通应用程序中几乎没有更改,因此幸运的是,这将适用于具有两个或更多单选按钮的大多数应用程序

(我看到这个问题得到了很好的意见,但还没有发布答案。所以我想我应该分享我最终解决这个问题的方法。)