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