即使验证触发,也取消WPF DataGrid中的编辑模式

时间:2013-12-07 21:33:48

标签: wpf wpfdatagrid wpftoolkit idataerrorinfo

我是wpf的新手,我需要使用一个WPF DataGrid,它的ItemSource设置为Model类型的ObservableCollection,其中Model实现了IDataErrorInfo类。 我面临的问题是,如果Model返回任何属性的验证字符串,那么用户无法退出单元格的编辑模式,我尝试回滚&我甚至尝试过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,则用户无法退出特定单元格的编辑模式。

This link on msdn在“备注”中说

  

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

即使验证返回了错误消息,是否有退出单元格编辑模式的解决方法?我无法使用代码体系结构,因为我坚持使用DataGrid以及'Model'类。任何帮助将不胜感激,非常感谢提前。

2 个答案:

答案 0 :(得分:3)

  

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

这是事实但可以通过解决方法克服 - 使用DataGridTemplateColumn.CellEditingTemplate和DataGridTemplateColumn.CellTemplate 中的 TextBox。

为datagrid定义数据窗口

    <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>

答案 1 :(得分:1)

我只是巧合地认出了这一点。

当您将每个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>