我想知道如何以编程方式在DataGridColumn上激活验证。它和donde调用BindingExpression的UpdateSource方法几乎相同,但是我无法获得列的BindingExpression。
感谢。
PS:在ValidationRule上设置ValidatesOnTargetUpdated属性不是我想要的:)
答案 0 :(得分:1)
在.NET Framework 4中,名为System.ComponentModel.DataAnnotations的命名空间可用于公共CLR(WPF)和较轻的Silverlight CLR。您可以将DataAnnotations命名空间用于各种目的。其中一个是使用属性进行数据验证,另一个是字段,属性和方法的可视化描述,或自定义特定属性的数据类型。这三个类别在.NET Framework中分类为验证属性,显示属性和数据建模属性。本节使用验证属性来定义对象的验证规则
http://www.codeproject.com/KB/dotnet/ValidationDotnetFramework.aspx
答案 1 :(得分:1)
@ user424096,
我无法访问我的visual studio环境,但是遵循伪代码可能会指导您获得所需的方式......
创建一个名为NotifySourceUpdates的附加布尔属性,并将附加到DataGridCell ...我已将它附加到datagrid级别,以便它适用于所有数据网格单元...您也可以在列级别附加它。 ..
<DataGrid ItemsSource="{Binding}">
<DataGrid.CellStyle>
<Style TargetType="DataGridCell" >
<Setter Property="ns:MyAttachedBehavior.NotifySourceUpdates" Value="True"/>
</Style>
</DataGrid.CellStyle>
</DataGrid>
此附加行为将处理在单元级别称为Binding.SourceUpdated的附加事件。因此,只要任何绑定作为任何子UI元素的正常或编辑模式的一部分更新其源,它就会触发并冒泡到单元级别。
public static readonly DependencyProperty NotifySourceUpdatesProperty
= DependencyProperty.RegisterAttached(
"NotifySourceUpdates",
typeof(bool),
typeof(MyAttachedBehavior),
new FrameworkPropertyMetadata(false, OnNotifySourceUpdates)
);
public static void SetNotifySourceUpdates(UIElement element, bool value)
{
element.SetValue(NotifySourceUpdatesProperty, value);
}
public static Boolean GetNotifySourceUpdates(UIElement element)
{
return (bool)element.GetValue(NotifySourceUpdatesProperty);
}
private static void OnNotifySourceUpdates(DependencyObject d, DependencyPropertyEventArgs e)
{
if ((bool)e.NewValue)
{
((DataGridCell)d).AddHandler(Binding.SourceUpdated, OnSourceUpdatedHandler);
}
}
在此事件处理程序中,事件args的类型为DataTransferEventArgs,它为您提供TargetObject。这将是您需要验证的控件。
private static void OnSourceUpdatedHandler(object obj, DataTransferEventArgs e) //// Please double check this signature
{
var uiElement = e.TargetObject as UIElement;
if (uiElement != null)
{
///... your code to validated uiElement.
}
}
在这里,您必须知道控件所代表的值是有效还是无效。
(uiElement.MyValue == null) //// Invalid!!
如果您希望控件的绑定无效,只需使用这些步骤使用MarkInvalid调用...
ValidationError validationError =
new ValidationError(myValidationRule,
uiElement.GetBindingExpression(UIElement.MyValueDependecyProperty));
validationError.ErrorContent = "Value is empty!";
Validation.MarkInvalid(uiElement.GetBindingExpression(UIElement.MyValueDependencyProperty), validationError);
让我知道这是否有效......
答案 2 :(得分:0)
您可以考虑实施System.ComponentModel.IDataErrorInfo来为此类输入提供验证。