0

为了测试控制组的验证,我看到了一个很好的解决方案:

在我的 Window.xaml.cs 中:

 private bool IsValid(DependencyObject obj)
    {
        // The dependency object is valid if it has no errors, 
        //and all of its children (that are dependency objects) are error-free.
        return !Validation.GetHasError(obj) &&
            LogicalTreeHelper.GetChildren(obj)
            .OfType<DependencyObject>()
            .All(child => IsValid(child));
    }

我的问题是,就我而言,即使我有错误,isValid 总是返回 true。我认为是因为 xaml 错误但是......在哪里?

这是我的 Windows.XAML :

<Window.Resources>
    <CommandBinding x:Key="binding" Command="Save" Executed="Save_Executed" CanExecute="Save_CanExecute" />
</Window.Resources>

<TextBox Name="TextBox_TypeEvenement" Grid.Column="1" VerticalAlignment="Center" Height="20">
  <TextBox.Text>
    <Binding Path="strEvtType">
        <Binding.ValidationRules>
            <ExceptionValidationRule />
        </Binding.ValidationRules>
    </Binding>
  </TextBox.Text>
</TextBox>

<Button Template="{StaticResource BoutonRessourcesTpl}" Command="Save">
  <Button.CommandBindings>
    <StaticResource ResourceKey="binding"></StaticResource>
  </Button.CommandBindings>
  <Image Source= "Toolbar_Valider.png" Height="16"/>
</Button>

这是我的 Class.cs c# :

private string m_strEvtType;
public string strEvtType
{
get { return m_strEvtType; }
set {
        m_strEvtType = value;
        if (m_objEvtCode.ReadEvtTypebyType(m_strEvtType) != 0)
        {
            throw new ApplicationException(m_strEvtType.Trim() + " est innexistant !");
        }
        FirePropertyChangedEvent("strEvtType");
        FirePropertyChangedEvent("m_objEvtCode.strDes");
    }
}

你知道为什么 isValid 总是返回 true 吗?

非常感谢 :)

此致 :)

4

1 回答 1

0

我认为问题是All你的用法Linq

如果源序列的每个元素都通过指定谓词中的测试,或者序列为空,则 All 将返回 true ;否则为假。

所以如果没有孩子DependencyObjectsDependencyObject All将返回true

尝试使用另一种 Linq 方法Any来检查您的IsValid状况

 return !Validation.GetHasError(obj) &&
            !LogicalTreeHelper.GetChildren(obj)
            .OfType<DependencyObject>()
            .Any(child => !IsValid(child));
于 2013-03-20T23:08:45.200 回答