Observablecollection.RemoveAt(item)不刷新UI

时间:2014-12-15 11:38:28

标签: c# wpf

我有ObservableCollection<MyType>,其中MyType使用Fody实现INotifyPropertyChanged

这个集合被绑定到我的ui,因为这个

<Grid x:Name="DetallePresupuesto" Grid.Row="2">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <TextBlock Text="{x:Static resources:Labels.SALUD_DetallePresupuesto}" Background="Bisque" TextAlignment="Center"/>
    <DataGrid 
        x:Name="DetallePresupuestoGrid" 
        Grid.Row="1" 
        Grid.ColumnSpan="1" 
        AutoGenerateColumns="False" 
        Style="{DynamicResource ParadigmaNDataGrid}" 
        ItemsSource="{Binding Path=DetallePresupuesto,UpdateSourceTrigger=PropertyChanged}">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
                <cmd:EventToCommand Command="{Binding ItemSelectionChangedCommand}" CommandParameter="{Binding ElementName=DetallePresupuestoGrid, Path=SelectedItem}"/>
            </i:EventTrigger>
            <i:EventTrigger EventName="AddingNewItem">
                <cmd:EventToCommand Command="{Binding InsertItemCommand}" PassEventArgsToCommand="True"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="{x:Static resources:Labels.GENERAL_Item}" Width="10*" ClipboardContentBinding="{x:Null}">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Merlin_ConceptosFacturacion.StrDescripcionConcepto}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <controls:Search SearchParms="{Binding ElementName=EstaVentana,Path=DataContext.BusqItems}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn Header="{x:Static resources:Labels.GENERAL_Cantidad}" Width="2*" Binding="{Binding Path=NumCantidad}" ClipboardContentBinding="{x:Null}"/>
            <DataGridTextColumn Header="{x:Static resources:Labels.GENERAL_ValorUnitario}" Width="2.5*" Binding="{Binding Path=NumValorFacturacionDigitado}" ClipboardContentBinding="{x:Null}"/>
            <DataGridTextColumn Header="{x:Static resources:Labels.GENERAL_ValorTotal}" Width="2.5*" Binding="{Binding Path=NumValor}" ClipboardContentBinding="{x:Null}"/>
            <DataGridTemplateColumn Width="70" Header="{x:Static resources:Labels.GENERAL_BorrarItem}" HeaderStyle="{StaticResource ResourceKey=ParadigmaNDataGridHeaderStyle}">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Style="{StaticResource InLineDeleteButton}" Command="{Binding Path=DataContext.DeleteCommand, ElementName=EstaVentana}" CommandParameter="{Binding ElementName=DetallePresupuestoGrid,Path=SelectedItem}" Visibility="{Binding Merlin_ConceptosFacturacion.NumIdConcepto,Converter={cnv:decimalToVisibilityConverter}}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>


private ObservableCollection<MyType> _DetallePresupuesto;
public ObservableCollection<MyType> DetallePresupuesto
{
    get {
        if (_DocumentoPresupuesto == null)
            return new ObservableCollection<MyType>();
        else
            return new ObservableCollection<MyType>(_DocumentoPresupuesto.Parent.MyType);
    }
    set { SetProperty(ref _DetallePresupuesto, value); }
 }

此命令每次删除一行

public void ExecuteDelete(object p)
{
    try
    {
        bool borro = false;
        MyType det = (MyType)p;
        MyType item = DetallePresupuesto.Where(x => x.NumIdTransaccion == det.NumIdTransaccion).FirstOrDefault();
        if (item != null)
        {
            DetallePresupuesto.RemoveAt(DetallePresupuesto.IndexOf(item));
            db.SetEntityState(det, EntityState.Deleted);
            db.SaveEntity(det);
        }
    }
    catch (Exception e)
    {
        ReportarInconsistencia(e.Message);
    }
}

我的问题是当从集合ID中删除一个项目时,但它没有刷新UI。

如何强制执行UI刷新?

1 个答案:

答案 0 :(得分:3)

您未在UI中绑定DetallePresupuesto。你绑定到:

return new ObservableCollection<MyType>();

return new ObservableCollection<MyType>(_DocumentoPresupuesto.Parent.MyType);

对于要更新的​​UI,您需要让属性返回要删除的列表,即DetallePresupuesto。这意味着getter应该看起来像这样。

public ObservableCollection<MyType> DetallePresupuesto
{
    get {
        if (_DetallePresupuesto == null)
            _DetallePresupuesto = new ObservableCollection<MyType>(); //populate here

        return _DetallePresupuesto;
    }
}

另外,请尽量避免收藏的设置者。