未调用绑定组验证函数

Bindinggroup validation function not called

我在我的 CustomControl 上设置了一个 BindingGroup 并实现了一个 Validator 函数。下面是来自 XAML 的代码片段。我的问题是验证器永远不会被调用。当我创建一个小示例程序时,一切正常。怎么追查原因?

XAML:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1"
    Title="MainWindow" Height="350" Width="525">
<Window.BindingGroup>
    <BindingGroup>
        <BindingGroup.ValidationRules>
            <local:DurationValidator/>
        </BindingGroup.ValidationRules>
    </BindingGroup>
</Window.BindingGroup>
<StackPanel>
    <TextBox Text="{Binding SomeString, UpdateSourceTrigger=PropertyChanged}"></TextBox>
    <Button>add</Button>
</StackPanel>
</Window>

后面的代码:

namespace WpfApplication1
{
    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = this;
            SomeString = "Some string";
        }

        private string _someString;
        public string SomeString
        {
            get { return _someString; }
            set
            {
                if (_someString == value) return;
                _someString = value;
                if (this.PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs("SomeString"));
            }
        }
    }
    public class DurationValidator : ValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            BindingGroup bindingGroup = (BindingGroup)value;
            return new ValidationResult(false, "Whatever");
        }
    }
}

参考下面的代码。

XAML

 <StackPanel x:Name="stk">
    <StackPanel.BindingGroup>
        <BindingGroup Name="myBindingGroup">
            <BindingGroup.ValidationRules>
                <local:DurationValidator ValidatesOnTargetUpdated="True" />
            </BindingGroup.ValidationRules>
        </BindingGroup>
    </StackPanel.BindingGroup>
    <TextBox Text="{Binding BindingGroupName=myBindingGroup,UpdateSourceTrigger=PropertyChanged,Path=SomeString,Mode=TwoWay}"></TextBox>
    <Button>add</Button> 
</StackPanel> 

C#

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
        SomeString = "Some string";
    }

    private string _someString;
    public string SomeString
    {
        get { return _someString; }
        set
        {
            if (_someString == value) return;
            _someString = value;
            if (this.PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("SomeString"));
            this.stk.BindingGroup.CommitEdit();
        }
    }
}
public class DurationValidator : ValidationRule
{
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        BindingGroup bindingGroup = (BindingGroup)value;
        return new ValidationResult(false, "Whatever");
    }
}