我是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'类。任何帮助将不胜感激,非常感谢提前。
答案 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>