取消WPF数据网格中的编辑模式,即使在激活验证时也是如此



我是wpf的新手,我需要使用一个wpf DataGrid,它的ItemSource设置为Model类型的ObservableCollection,其中Model实现IDataErrorInfo类。我面临的问题是,如果模型返回任何属性的验证字符串,则用户无法退出单元格的编辑模式,我尝试回滚&我甚至尝试了CancelEdit,但无法退出编辑模式。我在msdn上搜索了一下,发现了它是DataGrid的一个属性,但由于一些应用程序的要求,我也需要这样做。

我的型号类别:

public class Model: IDataErrorInfo
{
    public int PropertyName{ get; set; }
    // other properties & methods removed for clarity
    public string this[columnName]
    {
        get
        {
            if (PropertyName< 0)
                return "Error Message";
            else
                return string.Empty;
        }
    }
}

现在,如果"PropertyName"小于0,则用户无法退出特定单元格的编辑模式。

msdn上的这个链接在"备注"中说

在验证之前,DataGrid不会退出单元格编辑模式错误已解决。

即使验证返回错误消息,是否有退出单元格编辑模式的解决方法?我对代码体系结构无能为力,因为我被DataGrid和"Model"类卡住了。如有任何帮助,我们将不胜感激。

使用IdataErrorInfo验证WPF DataGrid,在解决验证错误之前,DataGrid不会退出单元格编辑模式。

这是真的,但可以通过变通方法来克服-使用DataGridTemplateColumn.CellEditingTemplate和DataGridTemplateColumn.CellTemplate.中的TextBox

为数据网格定义数据模板

    <DataGrid.Resources> 
    .... 
    <DataTemplate x:Key="EditingValueTemplate">
        <TextBox Text="{Binding bindingProp, ValidatesOnDataErrors=True}"
                                  FocusManager.FocusedElement="{Binding RelativeSource=  {RelativeSource Self}}"/>
    </DataTemplate>
</DataGrid.Resources>

将此数据模板分配给数据网格的CellTemplate和CellEditingTemplate

    <DataGrid.Columns>
<DataGridTemplateColumn Header="Value" CellTemplate="{StaticResource EditingValueTemplate}" 
                                        CellEditingTemplate="{StaticResource EditingValueTemplate}" />
</DataGrid.Columns>

如果您想指定工具提示以显示错误,即单元格编辑模式和鼠标悬停单元格。你需要一个风格

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

并将这种风格也包括在上述数据网格中,即

<DataGrid.Columns>
    <DataGridTemplateColumn Header="Value" CellTemplate="{StaticResource EditingValueTemplate}" 
                                            CellEditingTemplate="{StaticResource EditingValueTemplate}" 
                                            CellStyle="{StaticResource DatagridCellToolTip}"/>
</DataGrid.Columns>

我只是通过重合认识到了这一点。

当您将每个DataGridTextColumn替换为TemplateColumn并仅绑定到TextBox时,即使错误未修复,您也可以在每个TextBox之间跳转并编辑多行。

<DataGridTemplateColumn Header="Sample" Width="1*">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBox VerticalAlignment="Stretch" HorizontalAlignment="Stretch" >
                <TextBox.Text>
                    <Binding Path="SampleB" UpdateSourceTrigger="PropertyChanged">
                        <Binding.ValidationRules>
                            <vm:CellDataInfoValidationRule ValidationStep="UpdatedValue"/>
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>
            </TextBox>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

最新更新