Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight S/L 4&;IDataErrorInfo-如何强制重新验证控件(当触摸相关控件时)_Silverlight_Validation_Idataerrorinfo - Fatal编程技术网

Silverlight S/L 4&;IDataErrorInfo-如何强制重新验证控件(当触摸相关控件时)

Silverlight S/L 4&;IDataErrorInfo-如何强制重新验证控件(当触摸相关控件时),silverlight,validation,idataerrorinfo,Silverlight,Validation,Idataerrorinfo,我有两个绑定到属性MinCartValue和MaxCartValue的控件。MinCartValue必须小于MaxCartValue。为了实现这一验证,我已经实现了IDataErrorInfo接口,如果触摸了MinCartValue或MaxCartValue,则在this[columnName]方法中运行上述检查。ValidateSondaerRors=True是在两个控件的绑定中设置的。 验证工作正常,当对其属性值的更改违反规则时,会高亮显示每个控件。问题是,一旦一个控件被标记为无效,如果用户

我有两个绑定到属性MinCartValue和MaxCartValue的控件。MinCartValue必须小于MaxCartValue。为了实现这一验证,我已经实现了IDataErrorInfo接口,如果触摸了MinCartValue或MaxCartValue,则在this[columnName]方法中运行上述检查。ValidateSondaerRors=True是在两个控件的绑定中设置的。 验证工作正常,当对其属性值的更改违反规则时,会高亮显示每个控件。问题是,一旦一个控件被标记为无效,如果用户通过更改另一个控件的值来纠正问题,则第一个控件仍被标记为无效。这是可以理解的,因为IDataErrorInfo方法没有对第一个控件的属性进行验证

因此,我需要的是一种在验证属性#2时强制重新验证属性#1的方法(或清除无效状态的方法),反之亦然。我尝试在this[columnName]方法中调用RaisePropertyChanged,但它没有任何作用。还尝试将属性设置为其自身的值,以尝试欺骗它来验证自身,但同样没有发生任何事情


谢谢

我建议查看
INotifyDataErrorInfo
界面(在Silverlight 4中引入)。如果属性无效,它可以异步通知,因此我认为框架最好跨多个属性考虑这一点,而不是期望当前正在更改的属性是唯一有效性可能正在更改的属性。

我不确定是否完全理解您的问题,但这可能会有所帮助。提供一些示例XAML和绑定属性代码会有所帮助

这听起来像是代码的问题,取决于默认的UpdateSourceTrigger,对于TextBox控件,它是它们的焦点/取消焦点。您可以在XAML中设置UpdateSourceTrigger属性,方法是将UpdateSourceTrigger=Explicit添加到发生验证的绑定中。然后在每个文本框(MinCartValue、MaxCartValue)中,向TextChanged事件添加一个事件处理程序

在事件处理程序的代码隐藏中,可以执行以下操作:

    private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        TheTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
    }

本例中的文本框将是您的购物车控件之一。UpdateSource()方法是一种手动更新绑定值的方法,它将触发您的验证。此方法提供了一个绑定到触发器的方法,以更新值,并在默认范围外提升属性的更改(在本例中,在TextBox上使用文本更改的intead of focus和unfocus)。

以下是我如何解决此问题的。假设Property1和Property2是相互依赖的。我还不熟悉MVVM,但您可能正在扩展实体类以实现IDataErrorInfo。在这种情况下,您还可以扩展[Property]Changed方法并报告codependent属性中的更改:

partial class YourEntity : IDataErrorInfo
{
    public string this[string columnName]
        {
            //Your validation logic
        }

    public string Error
    {
        //WPF doesn't use it anyway
        get { return string.Empty; }
    }

    partial void OnProperty1Changed() 
    {
        OnPropertyChanging("Property2");
        OnPropertyChanged("Property2");
    }

    partial void OnProperty2Changed()
    {
        OnPropertyChanging("Property1");
        OnPropertyChanged("Property1");
    }
}
在这种情况下,此属性之一中的更新会使两个绑定控件重新计算自身

EDIT2:似乎应该使用OnPropertyChang*而不是ReportPropertyChang*。ReportPropertyChanged将通知实体框架模型中存在挂起的更改,但实际上您所要做的只是通知视图。您不希望使用未真正更改的属性更新数据库。ReportPropertyChang*在数据库中没有映射的计算字段上也会失败。
EDIT1:发现在ReportPropertyChanged之前调用ReportPropertyChange非常重要。

我有两个DateTime属性(DateFrom和DateTo),需要相互验证。在这些属性的设置程序中,我刚刚为DateTo和DateFrom引发了一个PropertyChanged事件。工作很有魅力。

谢谢。我应该提到,我使用的是MVVM方法,其中“代码隐藏”没有对XAML控件的引用。我想坚持这一点,所以我正在寻找一种方法,通过只引用充当数据上下文的对象的属性来实现这一点。是的,我不知道您是否在使用MVVM。我自己也试着关注MVVM,但不幸的是,我还没有找到一个好的MVVM解决方案。为什么
INotifyDataErrorInfo
不在WPF中?如此有用的界面!谢谢,但是ReportPropertyChanged在我的项目中不可用。它是实体框架的一部分吗?是的,它是EntityObject的受保护方法。起初我不知道你的奎斯顿是关于Silverlight的。我正在使用WPF,不确定它与SL之间的关系。