silverlight - Silverlight 4 中的数据验证

标签 silverlight validation silverlight-4.0

我在 SL4 中有控制权。我想在按钮单击时进行数据验证。大问题通常是 SL4 使用绑定(bind)属性进行验证。

就像这个例子中给出的例子

http://weblogs.asp.net/dwahlin/archive/2010/08/15/validating-data-in-silverlight-4-applications-idataerrorinfo.aspx

<TextBox Text="{Binding Name,Mode=TwoWay,ValidatesOnDataErrors=true}" 
    Height="23" 
    Width="120"
    HorizontalAlignment="Left" 
    VerticalAlignment="Top"    />

但我想显示这样的错误消息....

enter image description here

使用我自己的代码,例如按钮单击我检查
(textbox1.text == null ) 然后将这种错误样式设置为 textbox1

最佳答案

延迟验证的一种方法是设置属性 UpdateSourceTrigger=Explicit在绑定(bind)中。如果您这样做,绑定(bind)将不会更新源对象,因此不会导致验证错误,直到您明确告诉绑定(bind)这样做。单击按钮时,您将强制更新绑定(bind),对每个控件使用如下所示的行:

someTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();

然后,您的属性 setter 会为无效数据抛出异常。

如果有很多控件可以强制绑定(bind)更新,这种方法可能会有点麻烦。

此外,强制更新绑定(bind)必须在控件的代码隐藏中完成。如果您也使用带有按钮的命令,那么您可能会遇到问题。按钮可以同时具有 Command 和 Click 事件处理程序,并且两者都会在单击按钮时执行,但我不知道发生这种情况的顺序,或者即使可以保证顺序。一个快速的实验表明事件处理程序是在命令之前执行的,但我不知道这是否是未定义的行为。因此,有可能在更新绑定(bind)之前触发该命令。

以编程方式创建验证工具提示的一种方法是绑定(bind)文本框的另一个属性,然后故意导致此绑定(bind)出错。

'智能' posted a complete solution, including code在 Silverlight 论坛上(搜索 07-08-2009 下午 4:56 的帖子)。简而言之,他/她创建了一个辅助对象,该对象具有一个 getter 引发异常的属性,绑定(bind) Tag文本框的属性到此帮助器对象,然后强制更新绑定(bind)。

'sapient' 的代码是在 Silverlight 4 发布之前编写的。我们会将他/她的代码“升级”到 Silverlight 4。类 ControlValidationHelper变为以下:
public class ControlValidationHelper : IDataErrorInfo
{
    public string Message { get; set; }

    public object ValidationError { get; set; }

    public string Error
    {
        get { throw new NotImplementedException(); }
    }

    public string this[string columnName]
    {
        get { return Message; }
    }
}

很容易敲出一个快速演示应用程序来尝试一下。我创建了以下三个控件:
    <TextBox x:Name="tbx" Text="{Binding Path=Text, ValidatesOnDataErrors=True, NotifyOnValidationError=True, Mode=TwoWay}" />
    <Button Click="ForceError_Click">Force error</Button>
    <Button Click="ClearError_Click">Clear error</Button>
Text两个按钮的属性和事件处理程序位于代码隐藏中,如下所示:
    public string Text { get; set; }

    private void ForceError_Click(object sender, RoutedEventArgs e)
    {
        var helper = new ControlValidationHelper() { Message = "oh no!" };
        tbx.SetBinding(Control.TagProperty, new Binding("ValidationError")
        {
            Mode = BindingMode.TwoWay,
            NotifyOnValidationError = true,
            ValidatesOnDataErrors = true,
            UpdateSourceTrigger = UpdateSourceTrigger.Explicit,
            Source = helper
        });
        tbx.GetBindingExpression(Control.TagProperty).UpdateSource();
    }

    private void ClearError_Click(object sender, RoutedEventArgs e)
    {
        BindingExpression b = tbx.GetBindingExpression(Control.TagProperty);
        if (b != null)
        {
            ((ControlValidationHelper)b.DataItem).Message = null;
            b.UpdateSource();
        }
    }

“强制错误”按钮应使验证错误出现在文本框中,而“清除错误”按钮应使其消失。

如果您使用 ValidationSummary,则会出现此方法的一个潜在缺点。 . ValidationSummary 将列出针对 ValidationError 的所有验证错误。而不是针对每个属性的名称。

关于silverlight - Silverlight 4 中的数据验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5282919/

相关文章:

silverlight - XamlParseException 在 Expression Blend 中使用 Silverlight Toolkit 控件

c# - NotifyPropertyChanged 线程安全吗?

silverlight - 通过 Silverlight 访问 SharePoint Web 服务

javascript - Magento - 表单上的自定义验证不起作用

c# - 通过 C# silverlight 将动画重复行为设置为永远

c# - OpenFileDialog.ShowDialog() 在 Silverlight 中引发 InvalidOperationException

validation - 验证字段在 cakephp 3.0 中是唯一的

silverlight-4.0 - 如何以编程方式为TabControl创建HeaderTemplate?

mvvm - 绑定(bind)自定义文本框属性时出错

javascript - Ember 表单验证