[英]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);
}
將myobject
作為數據源傳遞給DataBindings.Add
意味着該對象僅更改屬性不會更改。
如果確實需要綁定以后的其他對象或將其設置為null
,而不是編寫特殊的函數來執行此操作,則需要使用允許更改“當前”對象的中間數據源。 最簡單的方法是在BindingSource
或BindingList<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.