我遇到了映射到自定义类的文本框的数据绑定属性的问题,大多数情况下它没有问题;当我更新绑定对象中的值时,更改将显示在文本框Text属性中,如果我将对象属性设置为null,则它将正确格式化为" -No数据 - &#34 ;但是当我将对象设置为null时,文本框中的文本值保持不变。
我有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
不应该将文本框文本更改为&#34; - 否 - 数据 - &#34;因为整个对象都是null?
我错过了正确显示所需数据的内容吗?
答案 0 :(得分:1)
将myobject设置为null只会删除该变量名称对该对象的引用。实际的实例化对象仍然绑定在DataBindings中,因此为了更改该对象的值,您需要通过textbox.DataBindings["SerialNumber"]
从那里访问它。
如果将SerialNumber设置为null,那当然是另一回事。然后它可以显示&#34; - 无数据 - &#34;作为null的默认值。
如果您希望删除对该对象的绑定,那么您需要在DataBindings集合上调用Remove方法,例如
private void RemoveSerialNumberBinding()
{
Binding serialNumberBinding = textBox1.DataBindings["SerialNumber"];
textBox1.DataBindings.Remove(serialNumberBinding);
}
答案 1 :(得分:1)
将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"
答案 2 :(得分:0)
“myobject = null”行不会破坏对象,该对象仍然存在。你只是没有参考它。您应该清除文本框的数据绑定。
在正常情况下,你应该有一些带有“myobject”属性的ViewModel类(实现INotifyPropertyChanged),这个ViewModel类应该绑定到View的DataContext,并且“myobject”属性应该绑定到文本框。清除“myobject”属性后,UI中的值将消失。
答案 3 :(得分:0)
当你设置myobject = null时,你的应用程序试图获得null的SerialNumber属性。如果它不能获得财产,它如何比较并告诉它是不同的?我想如果你永远不让你的对象为空,它会起作用。
而不是
n
这样做
myobject = null;