![](/img/trans.png)
[英]Listbox not updating when field inside observablecollection is changed
[英]Difficulty updating UI when contents of ObservableCollection is changed?
我有一個綁定到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是從數據庫下載的原始數據記錄。
一切都很好。
但是,在“撤消”操作中,我想用其原始記錄替換已編輯的insurance_View記錄,例如:
internal void UnDo()
{
insurance_View = (Insurance_View)pre_edit_Insurance_View.Clone();
}
盡管Insurance_View的編輯版本已正確更改回其原始形式,但顯示未更新。 此外,將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);
TIA
我想您的InsuranceTemplate
綁定了保險的屬性(例如CompanyName
,因此偵聽了Insurance
實例(模板的DataContext)的屬性更改事件。 因此,由於撤消操作不會通過調用相應的setter(而是通過更改insurance_view)來更改屬性,因此您必須手動觸發撤消后每個已更改屬性的屬性更改事件( OnPropertyChanged("CompanyName")
等)操作通知視圖。
在自己的可觀察集合中跟蹤舊保險。 在撤消操作中,您可以將舊集合分配給AllPatientInsurance,然后讓該屬性完成繁重的工作。
//initialize this elsewhere as appropriate
private ObservableCollection<Insurance> _oldPatientInsurance;
internal void UnDo()
{
insurance_View = (Insurance_View)pre_edit_Insurance_View.Clone();
AllPatientInsurance = _oldPatientInsurance;
}
此代碼不起作用,因為SelectedInsurance從集合中刪除后即為null:
AllPatientInsurance.Remove(SelectedInsurance);
AllPatientInsurance.Add(SelectedInsurance);
但是,如果保留了對SelectedInsurance的引用,則可以這樣添加回它:
SelectedInsurance.Reset();
var x = SelectedInsurance;
AllPatientInsurance.Remove(SelectedInsurance);
AllPatientInsurance.Add(x);
SelectedInsurance = x;
其中Reset()是
internal void Reset()
{
insurance_View = (Insurance_View)pre_edit_Insurance_View.Clone();
}
最后一行將組合框設置回最初選擇的項目。
很簡單。 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.