C#数据绑定:如果为null,则创建对象

时间:2011-02-25 00:31:50

标签: c# wpf data-binding

我有一个报表对象(即业务对象),它有几十个要填充的字段。每个字段本身都已实现INotifyPropertyChanged。活动报告有一个名为ActiveReport的访问者属性。

我想要做的是能够关闭当前报告,而不必打开新报告,并能够在用户再次开始输入数据时自动创建报告对象。

这是结构的粗略概念。 ActiveReport是当前的报告。 GUI能够通过绑定直接设置子类(名称/电子邮件)的字段。我希望在设置名称时创建新的BusinessObject,但ActiveReport为null。另外一个警告,报告对象是从XSD文件自动生成的,所以我宁愿不必修改它们。

class ControlClass {
    public BusinessObject ActiveReport { get; set; }
}

class BusinessObject {
    UserInfo field1 { get; set; }
}

class UserInfo : INotifyPropertyChanged {
    DependencyProperty name;
    DependencyProperty email;
}

我想到了以下场景:

  • 配件属性。
    • 绑定似乎不使用访问者。
  • 将检查插入所有事件处理程序。
    • 我宁愿不必诉诸于此 - 这打破了使用MVVM的理由。
  • Multibinding
    • 这需要使用转换器类和实例,这看起来有点过分。
  • 转换器

我想在WPF中询问是否还有其他好的编程模型。

2 个答案:

答案 0 :(得分:0)

您可以创建一种行为。 在其中,您检查(AssociatedObject.DataContext为ReportObject)是否为null 如果是,请清除所有字段/设置您的datacontext /无论

答案 1 :(得分:0)

这应该可以解决问题:

public class ControlClass
{
     public BusinessObject ActiveReport { get; set; }


     private UserInfo _editableUserData 
     public UserInfo EditableUserData
     {
         get { return _editableUserData; }
         set
         { 
             if (_editableUserData != null)
                   _editableUserData.PropertyChanged -= UserDataChanged;

             _editableUserData = value;

             if (_editableUserData != null)
                  _editableUserData.PropertyChanged += UserDataChanged;

             RaisePropertyChanged("EditableUserData");
         }
     }

     private void UserDataChanged(object sender, PropertyChangedEventArgs e)
     {
           if (ActiveReport == null)
                ActiveReport = new BusinessObject(EditableUserData);
     }
}