2015-12-18 2 views
0

В родительском объекте есть Observable Collection PendingPayment, который имеет список всех ожидающих платежей продаж с оплаченной суммой столбцов.Wpf - Как контролировать наблюдаемые обновления коллекции

Затем пользователь может выбрать конкретную продажу и открыть ее в новом дочернем окне.

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

Что я хочу, это сбор, который будет обновляться, только когда значения обновляются в базе данных.

+0

Для просмотра дочерних элементов вам потребуется создать отдельную коллекцию, содержащую разные объекты. Затем скопируйте данные обратно в объекты родительской наблюдаемой коллекции после того, как была выполнена резервная копия базы данных, или, наоборот, повторно получить данные в родительской форме после сохранения БД. – user469104

ответ

1

Это может быть достигнуто путем создания копии вашего объекта продажи, когда пользователь выбирает его в списке, а затем используя эту копию в качестве модели представления вашего дочернего представления.

После этого вы сможете установить новые значения в исходном объекте из списка только после нажатия кнопки сохранения и успешного обновления базы данных.

Другой способ продолжения, если вам нужно отредактировать только некоторые из свойств объекта, - это создать и отредактировать объект и использовать его в качестве модели представления дочернего окна. Что-то вроде этого:

public class Sale 
{ 
    public int PaidAmount { get; set; } 
    public int Some { get; set; } 
    public int More { get; set; } 
    public int Properties { get; set; } 
} 

public class SaleEditor 
{ 
    private Sale _sale; 

    public int PaidAmount { get; set; } 

    public SaleEditor(Sale sale) 
    { 
     _sale = sale; 
     PaidAmount = sale.PaidAmount; 
    } 

    public void Save() 
    { 
     // update your data here 
     _sale.PaidAmount = PaidAmount; 
    } 
} 

Если вам нужен исходный объект, чтобы обновить базу данных, а затем сохранить метод может сначала обновить объект и отменить изменения, если DB обновление не удалось:

public void Save() 
    { 
     var oldAmount = _sale.PaidAmount; 
     _sale.PaidAmount = PaidAmount; 

     if (!SalesDB.Update(_sale)) 
      _sale.PaidAmount = oldAmount; 
      // you could also read back the value from DB 
    } 
1

Всякий раз возможно (я никогда не вижу причины, почему это не может), для целей использования целенаправленного использования прокси или плоскостных объектов вы можете реализовать это с помощью запроса прогнозов. Затем пользователь выбирает элемент из списка, и единственное, что вам нужно захватить, - это ключ для загрузки полного объекта с требуемым графом объекта, который может потребоваться для использования.

Вот пример реализации с использованием Entity Framework и C# лямбда-выражения:

Использование анонимного объекта:

var anonymousListProjection = DbContext.PendingPayments.Select(pp=> 
    new { pp.Order, pp.Amount})   


Использование жёстко прописанные прокси:

var hardcodedListProjection = DbContext.PendingPayments.Select(pp=> 
    new PendingPaymentProxy { Order = pp.Order, Amount = pp.Amount}) 

//To return an observable:  
var observableColl = new ObservableCollection<PendingPaymentProxy> 
    (hardcodedListProjection.Tolist()); 

public class PendingPaymentProxy 
{ 
    public string Order { get; set; } 
    public decimal Amount{ get; set; }  
} 

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

Смежные вопросы