簡體   English   中英

數據綁定到C#中的對象

[英]Data Binding to an object in C#

Objective-c / cocoa提供了一種綁定形式,其中控件的屬性(即文本框中的文本)可以綁定到對象的屬性。 我試圖在C#w / .Net 3.5中復制此功能。

我在MyClass.cs文件中創建了以下非常簡單的類:

class MyClass
{
    private string myName;

    public string MyName
    {
        get
        {
            return myName;
        }

        set
        {
            myName = value;
        }
    }

    public MyClass()
    {
        myName = "Allen";
    }
}

我還創建了一個帶有1個文本框和1個按鈕的簡單表單。 我在表單代碼中初始化了一個Myclass實例並構建了項目。 使用Vs2008中的DataSource向導,我選擇了基於對象創建數據源,並選擇了MyClass程序集。 這創建了一個數據源實體。 我將文本框的數據綁定更改為此數據源; 但是,預期的結果(文本框的內容將是“allen”)未實現。 此外,將文本放入文本框不會更新對象的name屬性。

我知道我在這里缺少一些基本的東西。 在某些時候,我應該將我在表單代碼中初始化的MyClass類的實例綁定到文本框,但是沒有發生。 我在網上看到的一切似乎都掩蓋了使用DataBinding和一個對象(或者我完全沒有標記),所以任何幫助都非常感激。

編輯:

利用我從答案中學到的東西,我查看了Visual Studio生成的代碼,它具有以下內容:

this.myClassBindingSource.DataSource = typeof(BindingTest.MyClass);

如果我評論出來並替代:

this.myClassBindingSource.DataSource = new MyClass();

我得到了預期的行為。 為什么VS生成的默認代碼是這樣的? 假設這比工作方法更正確,我應該如何修改我的代碼才能在VS生成的范圍內工作?

您必須將文本框的數據源指定為新的數據源。 但另外,您必須將數據源的數據源分配為您的類的實例。

MyDataSource.DataSource = new MyClass();
TextBox1.DataSource = MyDataSource;

這應該適用於你的第一次傳球。 正如其他人所提到的,如果您要通過任何后台進程修改類屬性,則可能需要在類上實現其他接口(INotifyPropertyChanged等)。

如果您只是通過表單更新屬性,則不需要此步驟。

您應該為MyClass類型實現INotifyPropertyChanged接口:

public class MyClass : INotifyPropertyChanged
{
   private string _myName;

   public string MyName
   {
       get { return _myName; }
       set
       {
          if( _myName != value )
          {
              _myName = value;
              OnPropertyChanged("MyName");
          }
       }
   }

   public event PropertyChangedEventHandler PropertyChanged;

   private void OnPropertyChanged(string propertyName)
   {
       if( PropertyChanged != null )
           PropertyChanged( this , new PropertyChangedEventArgs(propertyName) );
   }       
}

如果要支持簡單數據綁定,則此接口是DataBinding基礎結構所必需的。 INotifyPropertyChanged接口用於通知“綁定”屬性已更改,因此DataBinding基礎結構可以相應地執行操作。

然后,您可以將MyName屬性數據綁定到文本框的Text屬性。

我在DataBinding.Add("TEXT", myObject, myObjectProperty)方法中收到一條錯誤消息

這可能是因為你錯過了屬性聲明中的顯式{get; set;}!

壞:

public string FirstName;    //<-- you will not be able to bind to this property!

好:

public string FirstName { get; set; }
using System.Collections.Generic;

public class SiteDataItem
{ 
private string _text; 
private string _url; 
private int _id; 
private int _parentId;

public string Text
{  
    get 
    { 
        return _text; 
    }  
    set 
    { 
        _text = value;
    } 
}

public string Url 
{  
    get 
    { 
        return _url; 
    }  
    set 
    { 
        _url = value;
    } 
}
public int ID 
{  
    get 
    { 
        return _id;
    }  
    set 
    { 
        _id = value;
    } 
}
public int ParentID 
{  
    get 
    { 
        return _parentId;
    } 
    set 
    { 
        _parentId = value;
    } 
}
public SiteDataItem(int id, int parentId, string text, string url)
{  
    _id = id;
    _parentId = parentId;
    _text = text;
    _url = url;
}

public static List<SiteDataItem> GetSiteData() 
{  
    List<SiteDataItem> siteData = new List<SiteDataItem>();
    siteData.Add(new SiteDataItem(1, 0, "All Sites", ""));  
    siteData.Add(new SiteDataItem(2, 1, "Search Engines", ""));
    siteData.Add(new SiteDataItem(3, 1, "News Sites", ""));
    siteData.Add(new SiteDataItem(4, 2, "Yahoo", "http://www.yahoo.com"));
    siteData.Add(new SiteDataItem(5, 2, "MSN", "http://www.msn.com"));  
    siteData.Add(new SiteDataItem(6, 2, "Google", "http://www.google.com"));  
    siteData.Add(new SiteDataItem(7, 3, "CNN", "http://www.cnn.com"));  
    siteData.Add(new SiteDataItem(8, 3, "BBC", "http://www.bbc.co.uk"));  
    siteData.Add(new SiteDataItem(9, 3, "FOX", "http://www.foxnews.com"));
    return siteData; 
}
}

更多細節你可以閱讀教程dapfor。 COM

看起來您可能需要MyName屬性上的Bindable屬性(並遵循Frederik的建議):

   [System.ComponentModel.Bindable(true)] 
   public string MyName
   {
       get { return _myName; }
       set
       {
          if( _myName != value )
          {
              _myName = value;
              OnPropertyChanged("MyName");
          }
       }
   }

通過: http//support.microsoft.com/kb/327413

我面前沒有任何代碼,但我認為數據源有點像集合。 您必須將MyClass的實例添加到數據源,這就是表單字段將綁定到的內容。 還有一些方法可以將數據源導航到MyClass的多個實例,但聽起來並不像你需要的那樣。 檢查DataSource的文檔。

我認為你不需要實現任何花哨的接口。 我似乎記得數據源上有一個方法,可以在更改某些值后刷新或重新綁定當前項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM