在WPF DataGrid中取消编辑模式,即使在激发验证时也是如此

在WPF DataGrid中取消编辑模式,即使在激发验证时也是如此,wpf,wpfdatagrid,wpftoolkit,idataerrorinfo,Wpf,Wpfdatagrid,Wpftoolkit,Idataerrorinfo,我是wpf新手,我需要使用一个wpf数据网格,它的ItemSource设置为Model类型的ObservableCollection,其中Model实现IDataErrorInfo类。 我面临的问题是,如果模型返回任何属性的验证字符串,那么用户无法退出单元格的编辑模式,我尝试了回滚&我甚至尝试了取消编辑,但我无法退出编辑模式。我搜索了msdn,发现了它是DataGrid的一个属性,但由于一些应用要求,我也需要这样做 我的模型课: public class Model: IDataErrorInf

我是wpf新手,我需要使用一个wpf数据网格,它的ItemSource设置为Model类型的ObservableCollection,其中Model实现IDataErrorInfo类。 我面临的问题是,如果模型返回任何属性的验证字符串,那么用户无法退出单元格的编辑模式,我尝试了回滚&我甚至尝试了取消编辑,但我无法退出编辑模式。我搜索了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;
        }
    }
}
公共类模型:IDataErrorInfo
{
公共int属性名称{get;set;}
//为清晰起见,删除了其他属性和方法
公共字符串此[columnName]
{
得到
{
如果(PropertyName<0)
返回“错误消息”;
其他的
返回字符串。空;
}
}
}
现在,如果“PropertyName”小于0,则用户无法退出特定单元格的编辑模式

在"评论"中说,

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

即使验证返回错误消息,是否存在退出单元格编辑模式的解决方法?我无法在代码体系结构方面提供帮助,因为我一直在使用DataGrid和“Model”类。任何帮助都将不胜感激,提前感谢

正在使用IdataErrorInfo验证WPF数据网格, 在验证错误得到解决之前,DataGrid不会退出单元格编辑模式

这是正确的,但可以通过一种变通方法来克服——使用DataGridTemplateColumn.CellEditingTemplate和DataGridTemplateColumn.CellTemplate中的文本框

为datagrid定义datatemplate

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

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

正在使用IdataErrorInfo验证WPF数据网格, 在验证错误得到解决之前,DataGrid不会退出单元格编辑模式

这是正确的,但可以通过一种变通方法来克服——使用DataGridTemplateColumn.CellEditingTemplate和DataGridTemplateColumn.CellTemplate中的文本框

为datagrid定义datatemplate

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

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

我恰好意识到了这一点

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

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

我恰好意识到了这一点

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

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


如果您将单元格更改回以前的有效状态,用户将如何得到他做错了事情的通知。他可能会在单元格中不断重复设置-1,但它将始终更改回0。(如果编辑前0是当前值)。你真的想要这个吗?基本上这只是我申请要求的一小部分。。有一个错误列表,用户选择一个错误,焦点自动转到该元素,现在如果用户在网格中选择其他错误,焦点不会更改,因为旧错误没有修复,但我希望焦点更改为新选择的错误,网格不允许更改编辑元素。(我正在使用WPF工具包网格)。如果旧的错误被修复了,我可以改变焦点。但是你永远不会在错误列表中添加任何项目,因为在离开单元格lol之前,你需要先修复单元格中的错误。那么,这又有什么意义呢。告诉我们你为什么这么做的更多信息。也许我们会为你找到更好的建议。你所说的名单永远不会被填满。我完全明白你的意思。。但是我的申请要求。。我不能很好地解释这件事。。我通过在
此[columnName]
中添加错误来填充列表(在继承自
IDataErrorInfo
的模型中),因此列表可以正常填充。我所说的验证约束基本上是指“属性应该在10到20之间”。现在让我们假设用户添加一个新行,在4个属性上进行验证,因此列表将被填充(如果需要,我可以给出代码)。我希望用户能够在错误之间导航,而不必修复它们。(该错误列表也有其他错误,它类似于整个应用程序的全局错误列表)。一个示例代码会有帮助吗?如果您将单元格更改回以前的有效状态,那么用户应该如何得到他做错了事情的通知。他可能会不断地重复这些话