C # Databinding: Создать объект, если ноль - PullRequest
2 голосов
/ 25 февраля 2011

У меня есть объект отчета (то есть бизнес-объект), который имеет несколько десятков полей для заполнения. Каждое поле само по себе имеет INotifyPropertyChanged. Для активного отчета есть свойство доступа, называемое ActiveReport.

Я хочу закрыть текущий отчет, не обязательно открывая новый, и иметь возможность автоматически создавать объект отчета, когда пользователь снова начинает вводить данные.

Вот примерное представление о структуре. ActiveReport текущий отчет. Графический интерфейс позволяет напрямую устанавливать поля подкласса (имя / адрес электронной почты) через привязку. Я хочу, чтобы новый BusinessObject создавался при задании имени, но ActiveReport имеет значение null. Еще одно предостережение: объект отчета автоматически генерируется из XSD-файлов, поэтому я бы предпочел не изменять его.

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

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

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

Я подумал о следующих сценариях:

  • Свойство Accessor.
    • Кажется, что привязка не использует аксессор.
  • Вставка проверки во все обработчики событий.
    • Я бы предпочел не прибегать к этому - это нарушает обоснование использования MVVM.
  • MultiBinding
    • Это потребует использования класса и экземпляра конвертера, и это выглядит как перебор.
  • Конвертер

Я подумал спросить, есть ли другие хорошие модели программирования для этого в WPF.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2011

Это должно сработать:

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);
     }
}
0 голосов
/ 25 февраля 2011

Вы можете создать поведение. в нем вы проверяете, является ли (AssociatedObject.DataContext as ReportObject) пустым и если это так, очистите все свои поля / установите текстовый текст данных / что угодно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...