更改ObservableCollection的内容时难以更新UI?

时间:2015-08-26 14:49:16

标签: c# wpf xaml data-binding

我有一个组合框绑定到一个可观察的集合:

 <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"); }
    }

Now Insurance封装从数据库下载的数据,并将INotifyPropertyChanged添加为:

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

其中insurance_View是从数据库下载的原始数据记录。

一切都很好。

然而,在&#34; UnDo&#34;操作,我想用其原始记录替换已编辑的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 setter          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

2 个答案:

答案 0 :(得分:1)

我认为你的$ export PYTHONPATH=/usr/local/lib/python2.7/site-packages/ 已经对保险&#39;诸如InsuranceTemplate之类的属性因此从CompanyName实例(模板的DataContext)中侦听属性更改的事件。因此,因为撤消操作不会通过调用相应的setter来更改属性(但是通过更改insurance_view),您必须手动触发每个更改后的属性的属性更改事件(Insurance等)。撤消操作以通知视图。

答案 1 :(得分:0)

此代码不起作用,因为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();
    }

并且最后一行将组合框设置回最初选择的项目。

这么简单。 :)