2015-08-26 2 views
0

У меня есть выпадающий связанный с ObservableCollection как:Сложность обновления пользовательского интерфейса при изменении содержимого ObservableCollection?

<ComboBox 
     HorizontalAlignment="Left" Margin="586,51,0,0" VerticalAlignment="Top" Width="372" 
     SelectedItem="{Binding PrimaryInsurance.SelectedInsurance}" 
     ItemsSource="{Binding PrimaryInsurance.AllPatientInsurance}" 
     ItemTemplate="{StaticResource InsuranceTemplate}" /> 

Сам ObservableCollection определяется как:

private ObservableCollection<Insurance> _allPatientInsurance; 
public ObservableCollection<Insurance> AllPatientInsurance 
    { 
     get { return _allPatientInsurance; } 
     set { if (_allPatientInsurance == value) return; _allPatientInsurance = value; OnPropertyChanged("AllPatientInsurance"); } 
    } 

Теперь страхование инкапсулирует данные, загруженные с базой данных добавляет INotifyPropertyChanged как:

public string CompanyName 
    { 
     get { return insurance_View.Companyname; } 
     set { if (insurance_View.Companyname == value) return; insurance_View.Companyname = value; OnPropertyChanged("CompanyName"); } 
    } 

Где insurance_View - это необработанная запись данных, загружаемая из базы данных.

Все это хорошо.

Однако в ходе операции «Undo», я хотел бы заменить отредактированное insurance_View запись с его оригинальной записью, как:

internal void UnDo() 
    { 
     insurance_View = (Insurance_View)pre_edit_Insurance_View.Clone(); 
    } 

Хотя сокращенная версия insurance_View правильно изменена обратно к своей первоначальной форме, дисплей не обновляется. Futhermore, заменив отредактированную версию страхования с оригинальной версией страхования в ObservableCollection как:

AllPatientInsurance.Remove(Old Insurance); 
    AllPatientInsurance.Add(New Insurance); 

Уничтожает все привязки и отображает пустую запись.

Итак, что является лучшим способом обновления дисплея при изменении содержимого страхования без разрушения объекта страхования? Есть ли способ лучше?

Редактировать # 1. Чтобы быть ясным, я пытаюсь заменить запись данных в объекте страхования, где объект страхования связан с дисплеем. Я не хочу заменять всю отображаемую коллекцию. Единственное, что приходит на ум - это заменить каждое значение отредактированной записи исходным значением, но это кажется утомительным, поэтому я надеюсь на лучший метод.

Редактировать # 2. Есть ли способ инициировать установки страхования, когда изменяется инкапсулированная запись Insurance_View?

Редактировать # 3. Шаблон страхования:

 <!--DataTemplate for the Combobox Insurance List--> 
    <DataTemplate x:Key="InsuranceTemplate"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="20" /> 
       <ColumnDefinition Width="120" /> 
       <ColumnDefinition Width="50" /> 
       <ColumnDefinition Width="14" /> 
       <ColumnDefinition Width="50" /> 
       <ColumnDefinition Width="60" /> 
      </Grid.ColumnDefinitions> 
      <TextBlock Text="{Binding XNotInEffect}" Grid.Column="0" /> 
      <TextBlock Text="{Binding CompanyName}" Grid.Column="1"/> 
      <TextBlock Text="{Binding EffectiveDateFrom}" Grid.Column="2"/> 
      <TextBlock Text="--" Grid.Column="3" /> 
      <TextBlock Text="{Binding EffectiveDateTo}" Grid.Column="4" /> 
      <TextBlock Text="{Binding InsuranceType}" Grid.Column="5"/> 
     </Grid> 
    </DataTemplate> 

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

AllPatientInsurance.Remove(SelectedInsurance); 
    AllPatientInsurance.Add(SelectedInsurance); 

ТИА

+0

Является ли объект страхования imimentInotifyPropertyChanged? –

+0

@StuartSmith да. –

ответ

0

Трек старый страхование в своей собственной наблюдаемой коллекции. В вашем отмене вы можете назначить старую коллекцию AllPatientInsurance и позволить собственности делать тяжелый подъем.

//initialize this elsewhere as appropriate 
private ObservableCollection<Insurance> _oldPatientInsurance; 

internal void UnDo() 
{ 
    insurance_View = (Insurance_View)pre_edit_Insurance_View.Clone(); 
    AllPatientInsurance = _oldPatientInsurance; 
} 
+0

Страховой_файл содержится в объекте страхования. Внутренний UnDo() не знает коллекцию, в которой он находится. Кроме того, я стараюсь не заменять существующую коллекцию AllPatientInsurance. Это просто запись в объекте, выставленном коллекцией. Благодарю. –

1

Я полагаю, ваш InsuranceTemplate имеет привязки к свойствам страхования», таким как CompanyName и, следовательно, прослушивает свойство изменилось событием из Insurance экземпляра (шаблон DataContext).Поэтому, поскольку операция отмены не изменяет свойства, вызвав соответствующие сеттеры (но, изменив страховой вид), вы должны вручную активировать измененные события свойства (OnPropertyChanged("CompanyName") и т. Д.) Каждого измененного свойства после операции отмены, чтобы уведомить представление ,

+0

Да ... Кажется, так. Я надеялся на лучший способ или, по крайней мере, цикл for, который мог бы заменить значения для сопоставления свойств на разных объектах. :( –

+0

Ваша альтернатива удалять и добавлять экземпляр в 'ObservableCollection' тоже должна работать. Вы имеете в виду под« уничтожением всех привязок »выбранного элемента? Потому что, если вы удаляете элемент, который выбран в данный момент, выбран параметр SelectedItem null. После добавления новой страховки (которая должна быть старой страховкой с отмененными значениями) вы должны выбрать ее в коде позади. – whyloop

+0

Когда я использую раскрывающийся список на ComboBox, есть пустая строка, где «новый» объект страхования должен отображаться. Все остальные объекты страхования отображаются без проблем. –

0

Этот код не работает, потому что SelectedInsurance становится нулевой момент он удаляется из коллекции:

AllPatientInsurance.Remove(SelectedInsurance); 
AllPatientInsurance.Add(SelectedInsurance); 

Однако, если ссылка на SelectedInsurance сохраняется, то он может быть добавлен назад как так:

SelectedInsurance.Reset(); 
var x = SelectedInsurance; 
AllPatientInsurance.Remove(SelectedInsurance); 
AllPatientInsurance.Add(x); 
SelectedInsurance = x; 

Где Сброс() является

internal void Reset() 
    { 
     insurance_View = (Insurance_View)pre_edit_Insurance_View.Clone(); 
    } 

и последний Li ne задает combobox обратно к первоначально выбранному элементу.

Так просто. :)

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