Wpf 防止在发生错误时更新到ObservableCollection

Wpf 防止在发生错误时更新到ObservableCollection,wpf,xaml,Wpf,Xaml,当xaml中存在验证错误时,是否有方法防止更新到ObservableCollection列表?我在xaml中使用“绑定” 我的xaml 上面的代码将在工具提示中显示错误,当出现验证错误时,单元格将变为红色。问题是集合更新时使用了无效值。在用户解决所有验证之前,是否有办法防止对集合进行更新?您可以通过克隆在编辑模式下输入的对象来解决问题,当有验证返回克隆对象并刷新数据网格项放入您的代码,或解释更多内容。@safi请查看更新 <ControlTemplate x:Key="ErrorTem

当xaml中存在验证错误时,是否有方法防止更新到ObservableCollection列表?我在xaml中使用“绑定”

我的xaml


上面的代码将在工具提示中显示错误,当出现验证错误时,单元格将变为红色。问题是集合更新时使用了无效值。在用户解决所有验证之前,是否有办法防止对集合进行更新?

您可以通过
克隆
编辑模式下输入的对象来解决问题,当有验证返回
克隆对象
并刷新
数据网格项

放入您的代码,或解释更多内容。@safi请查看更新
<ControlTemplate x:Key="ErrorTemplate">
    <DockPanel LastChildFill="True">
        <Border BorderBrush="Red" BorderThickness="1">
            <AdornedElementPlaceholder />
        </Border>
    </DockPanel>
</ControlTemplate>

<Style TargetType="TextBlock">
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip"
  Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
        </Trigger>
    </Style.Triggers>
</Style>

</Window.Resources>
<DataGrid Name="grid" HorizontalAlignment="Stretch" ItemsSource="{Binding mMngModelList}"   Margin="0,0,0,50" VerticalAlignment="Stretch" AutoGenerateColumns="False" CanUserAddRows="False">

    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Name">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding Name}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>                
        <DataGridTemplateColumn Header="Type">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Type}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding Type}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Range Left">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding RangeLeft,ValidatesOnDataErrors=True, NotifyOnValidationError=True, ValidatesOnExceptions=True}" Validation.ErrorTemplate="{StaticResource ErrorTemplate}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding RangeLeft, ValidatesOnDataErrors=True, NotifyOnValidationError=True, ValidatesOnExceptions=True}" Validation.ErrorTemplate="{StaticResource ErrorTemplate}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>
public string this[string columnName]
{
get
{
    var result = string.Empty;
    switch (columnName)
    {
        case "RangeLeft":
            if (RangeLeft == 0)
            {
                result = "RangeLeft should be greater than zero";
            }
            break;
    }

    return result;

}
}

public string Error
{
get
{
    StringBuilder error = new StringBuilder();

// iterate over all of the properties
// of this object - aggregating any validation errors
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(this);
foreach (PropertyDescriptor prop in props)
{
    String propertyError = this[prop.Name];
    if (propertyError != string.Empty)
    {
        error.Append((error.Length != 0 ? ", " : "") + propertyError);
    }
}

return error.Length == 0 ? null : error.ToString();
}
}