[英]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.