簡體   English   中英

當object為null時,綁定控件不會更新其值

[英]Bound control doesn't update its value when object is null

我有一個映射到自定義類的文本框的數據綁定屬性存在問題,在大多數情況下它都可以正常工作; 當我更新綁定對象中的值時,更改將出現在文本框的Text屬性中,如果我將objects 屬性設置為null,則其格式將正確設置為“ -No Data-”,但是當我將對象設置為null時,Text值在文本框中保持不變。

我有2節課

Class1
Class2

Class1通過以下方式實現INotifyPropertyChanged:

public class Class1: INotifyPropertyChanged
{
   private string _serial;

   public event PropertyChangedEventHandler PropertyChanged;
   protected void OnPropertyChanged(string propertyName = null)
   {
       if (PropertyChanged != null)
       {
          PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
       }
   }

   [DisplayName("Serial Number")]
   public string SerialNumber
   {
     get { return _serial; }
     set
     {
       _serial = value;
       OnPropertyChanged("SerialNumber");
     }
   }
 }

Class2繼承自Class1:

public class Class2: Class1
{
  //My props & methods, etc.
}

在我的表單中,我通過以下方式綁定文本框的Text屬性:

Class2 myobject = new Class2();

myobject.SerialNumber = "1234";

//I only need the textbox to display, not update the datasource
//so i use DataSourceUpdateMode.Never
mytextbox.DataBindings.Add("Text", myobject, "SerialNumber",true,DataSourceUpdateMode.Never,"-No Data-");

稍后,如果我在對象中進行以下分配,則會發生這種情況:

myobject.SerialNumber = "123"; //mytextbox Text is "123"
myobject.SerialNumber = "456"; //mytextbox Text changes to "456"

myobject.SerialNumber = "123"; //mytextbox Text is "123"
myobject.SerialNumber = null;  //mytextbox Text changes to "-No Data-"

myobject.SerialNumber = "123"; //mytextbox Text is "123"
myobject = null;               //mytextbox Text remains "123" <-this is the problem

文本框不應該更改為“ -No Data-”,因為整個對象為null?

我是否缺少適當顯示所需數據的內容?

將myobject設置為null只會刪除對該變量名稱對該對象的引用。 實際的實例化對象仍綁定在DataBindings中,因此,要更改該對象的值,您將需要通過textbox.DataBindings["SerialNumber"]從那里訪問它。

如果將SerialNumber設置為null,那當然是另一回事了。 然后,它可能會為您顯示“ -No Data-”作為null的默認值。

如果您希望刪除與該對象的綁定,則需要在DataBindings集合上調用Remove方法,例如

private void RemoveSerialNumberBinding()
{
   Binding serialNumberBinding = textBox1.DataBindings["SerialNumber"];
   textBox1.DataBindings.Remove(serialNumberBinding);
}

https://msdn.microsoft.com/zh-cn/library/system.windows.forms.controlbindingscollection.remove%28v=vs.110%29.aspx

myobject作為數據源傳遞給DataBindings.Add意味着該對象僅更改屬性不會更改。

如果確實需要綁定以后的其他對象或將其設置為null ,而不是編寫特殊的函數來執行此操作,則需要使用允許更改“當前”對象的中間數據源。 最簡單的方法是在BindingSourceBindingList<T>使用單個項目列表。

這是BindingSource的示例:

表單成員:

BindingSource dataSource = new BindingSource { DataSource = typeof(Class2) };
Class2 selectedObject;
Class2 SelectedObject
{
    get { return selectedObject; }
    set
    {
        selectedObject = value;
        dataSource.Clear();
        dataSource.Add(value);
    }
}

綁定(在構造函數/加載事件中一次初始化):

mytextbox.DataBindings.Add("Text", dataSource, "SerialNumber", true, DataSourceUpdateMode.Never, "-No Data-");
// similar for other controls

數據操作:

SelectedObject = new Class2 { SerialNumber = "1234" }; //mytextbox Text is "1234"
SelectedObject.SerialNumber = "123"; //mytextbox Text is "123"
SelectedObject.SerialNumber = "456"; //mytextbox Text is "456"
SelectedObject.SerialNumber = null;  //mytextbox Text is "-No Data-"
SelectdObject.SerialNumber = "123";  //mytextbox Text is "123"
SelectedObject = null;               //mytextbox Text is "-No Data-"
SelectedObject = new Class2 { SerialNumber = "2345" }; //mytextbox Text is "2345"

“ myobject = null”行不會銷毀該對象,該對象仍然存在。 您只是沒有參考。 您應該清除文本框的數據綁定。

在正常情況下,您應該具有一些帶有“ myobject”屬性的ViewModel類(實現INotifyPropertyChanged),該ViewModel類應綁定到視圖的DataContext,“ myobject”屬性應綁定到文本框。 清除“ myobject”屬性后,UI中的值將消失。

當您將myobject設置為null時,則您的應用程序將嘗試獲取SerialNumber屬性為null。 如果無法獲取該屬性,如何比較並判斷是否不同? 我想如果您永遠不要讓您的對象為null,那將行得通。

代替

myobject = null; 

做這個

myobject = new Class2();

暫無
暫無

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

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