C# 这就是数据绑定的方式和吸引力吗?

C# 这就是数据绑定的方式和吸引力吗?,c#,winforms,data-binding,dynamic,C#,Winforms,Data Binding,Dynamic,好吧,让我们看看我是否在想: 如果我只是想从一个源中读取一些数据,然后将其应用于某个控件,那么我最好直接这样做,而不是麻烦地进行数据绑定。瞧,我也可以这么做: foreach (var quad in listQH) { ... tb.Text = quad.Ph1; ……而不是: tb.DataBindings.Add(new Binding("Text", quad, "Ph1")); 但是,如果我希望在基础类实例中进行更新以更新控件(本例中为“tb”文本框),并希望用户更新

好吧,让我们看看我是否在想:

如果我只是想从一个源中读取一些数据,然后将其应用于某个控件,那么我最好直接这样做,而不是麻烦地进行数据绑定。瞧,我也可以这么做:

foreach (var quad in listQH)
{
   ...
   tb.Text = quad.Ph1;
……而不是:

tb.DataBindings.Add(new Binding("Text", quad, "Ph1"));
但是,如果我希望在基础类实例中进行更新以更新控件(本例中为“tb”文本框),并希望用户更新控件以更新这些类实例成员(“双向绑定”),我需要实现INotifyPropertyChanged。但是,我必须更改此代码:

List<QHQuad> listQH = GetForPlatypus(PlatypusId, dow); // listQH locally declared
foreach (var quad in listQH)
{
    int QHCell = quad.QH;
    if ((QHCell >= 1) || (QHCell <= QUARTER_HOUR_COUNT))
    {
        string PH1CellToPopulate = string.Format("textBoxA_{0}", QHCell);
        string PH2CellToPopulate = string.Format("textBoxB_{0}", QHCell);
        string PH3CellToPopulate = string.Format("textBoxC_{0}", QHCell);
        var tb = (TextBox)this.Contro.Find(PH1CellToPopulate, true).First();
        tb.DataBindings.Add(new Binding("Text", quad, "Ph1"));
        . . .

你的想法是对的。不过,这里有一些建议

仅当希望从ViewModel中的更改冒泡到视图时,才需要INotifyPropertyChanged。双向绑定不需要它。如果您想要双向绑定,并且在加载视图时只需要读取一次,则可以使用普通属性


您可能想查看MVVM(Model-View-ViewModel)模式。这是WPF、Silverlight、Metro等的推荐设计模式,因为它非常适合数据绑定量大的实现。

我错了,我错过了“winform”标签。除声明性绑定位外,所有内容都适用。有些控件提供了足够的属性,可以从设计器访问这些属性来替换该部分。如果说声明性绑定,您的意思是“tb.DataBindings.Add(new binding(“Text”,quad,“Ph1”);”我已经做到了。我想知道的是,在控件中进行更改是否会自动更新“listQH”类,以便最终我可以循环使用它并使用用户所做的更改更新数据库。
List<QHQuad> listQH; //global to the form
. . .
listQH = GetInfoForPlatypus(PlatypusId, dow);
foreach (var quad in listQH)
{
    // the same as above
foreach (var quad in listQH)
{
    UpdateQH(quad); // quad contains members QH, Ph1, Ph2, and Ph3 ("UPDATE BLA SET PH1 = :Ph1, PH2 = :Ph2, PH3 = :Ph3 WHERE QH = :QH")
}