繁体   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