【问题标题】:OnPropertyChange not firing IDataErrorInfo.this[]OnPropertyChange 未触发 IDataErrorInfo.this[]
【发布时间】:2013-09-03 00:53:21
【问题描述】:

我正在尝试使用 IDataErrorInfo 捕获错误,但绑定数据中的更改不会触发 IdataErrorInfo.this[]。我相信这是由于我将数据绑定到文本框的方式。

我的文本框文本绑定到源如下:

    <TextBox Grid.Row="0" Grid.Column="1" Margin="8 0 0 0"
                   Text="{Binding LimitsConfiguration.ThisItemMax, Mode=TwoWay, ValidatesOnDataErrors=True, NotifyOnValidationError=True}"
                   Style="{StaticResource ValidatableTextBoxStyle}"
                   HorizontalAlignment="Left" Width="40" Height="25" VerticalAlignment="Bottom" />

StaticResource 定义为:

    <Style  x:Key="ValidatableTextBoxStyle" TargetType="TextBox">
                <Style.Triggers>
                    <Trigger Property="Validation.HasError" Value="true">
                        <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}" />
                    </Trigger>
                </Style.Triggers>
    </Style>

源定义如下。请注意,他的对象不是在同一个命名空间中创建的,并且其中定义了大约 9 个不同的字符串成员。

    public LimitsConfig LimitsConfiguration
    {
        get { return _limitsConfiguration; }
        set
        {
            _limitsConfiguration  = value;
            OnPropertyChanged("LimitsConfiguration");
        }
    }

而我的 IDataErrorInfo.this[] 实现如下:

  string IDataErrorInfo.this[string propertyName]
  {
       get
       {
            string result = String.Empty;
            string limitsErrorMsg = "Enter a numeric value for ";
            int i;

            if (propertyName == "LimitsConfiguration")
            {
                if (propertyName == LimitsConfiguration.ThisItemMax.ToString())
                {
                    string msg = limitsErrorMsg + "Max Itmes";
                    string field = LimitsConfiguration.ThisItemMax.ToString();

                    result = ValidateLimit(field, msg);
                }

             }

            return result;
        }
   }

IDataInfo.this[string propertyName] 的实现永远不会被命中。但是,当文本框文本绑定到字符串类型时,IDataErrorInfo 实现工作。因此,我认为问题是由于源成员的绑定(Binding LimitsConfiguration.WaypointsMax),但我不知道如何解决它除了为 LimitsConfiguraton 对象中的所有项目创建公共成员(我'宁愿不这样做)。

我是 WPF 新手,如有任何想法,我们将不胜感激。

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    文本框不侦听包含LimitsConfiguration 属性的类的属性更改事件。相反,它会监听 LimitsConfig 类的属性更改事件,因为这是包含绑定到文本框的属性的类。

    【讨论】:

    • 有道理。谢谢。
    猜你喜欢
    • 2012-12-10
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多