当object为null时,绑定控件不会更新其值

时间:2016-03-23 17:38:01

标签: c# winforms inotifypropertychanged

我遇到了映射到自定义类的文本框的数据绑定属性的问题,大多数情况下它没有问题;当我更新绑定对象中的值时,更改将显示在文本框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?

我错过了正确显示所需数据的内容吗?

4 个答案:

答案 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);
}

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

答案 1 :(得分:1)

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"

答案 2 :(得分:0)

“myobject = null”行不会破坏对象,该对象仍然存在。你只是没有参考它。您应该清除文本框的数据绑定。

在正常情况下,你应该有一些带有“myobject”属性的ViewModel类(实现INotifyPropertyChanged),这个ViewModel类应该绑定到View的DataContext,并且“myobject”属性应该绑定到文本框。清除“myobject”属性后,UI中的值将消失。

答案 3 :(得分:0)

当你设置myobject = null时,你的应用程序试图获得null的SerialNumber属性。如果它不能获得财产,它如何比较并告诉它是不同的?我想如果你永远不让你的对象为空,它会起作用。

而不是

n

这样做

myobject = null;