1

我是 WPF 的新手。表单的数据上下文包括一个StartTime和一个EndTime字段(使用 MVVM),我已经成功地将它们绑定到它们自己的文本框。我正在尝试创建一个验证来检查新用户输入的值StartTime是否在该EndTime值之前。以下代码似乎没有将该EndTime字段绑定到验证参数Maximum

XAML:

<TextBox>
    <TextBox.Text>
        <Binding Path="StartTime" UpdateSourceTrigger="LostFocus" StringFormat="{}{0:hh}:{0:mm}">
            <Binding.ValidationRules>                                            
                <local:ValidateTime>
                    <local:ValidateTime.Maximum>
                        <local:ValidationParameter Parameter="{Binding EndTime, StringFormat=hh\\:mm}" />
                    </local:ValidateTime.Maximum>
                </local:ValidateTime>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

查看型号:

public class ValidationParameter : DependencyObject
{
    public static readonly DependencyProperty ParameterProperty = DependencyProperty.Register(
        "Parameter",
        typeof(string),
        typeof(ValidationParameter),
        new FrameworkPropertyMetadata(null));

    public string Parameter
    {
        get { return (string)GetValue(ParameterProperty); }
        set { SetValue(ParameterProperty, value); }
    }
}

public class ValidateTime : ValidationRule
{
    private TimeSpan _Minimum = new TimeSpan(0, 0, 0);
    private TimeSpan _Maximum = new TimeSpan(23, 59, 9);
    private ValidationParameter _MinimumProperty;
    private ValidationParameter _MaximumProperty;

    public ValidationParameter Minimum
    {
        get
        {
            return _MinimumProperty;
        }
        set
        {
            TimeSpan ts;
            if (TimeSpan.TryParse(value.Parameter, out ts))
            {
                _Minimum = ts;
                _MinimumProperty = value;
            }
        }
    }

    public ValidationParameter Maximum
    {
        get 
        {
            return _MaximumProperty;
        }
        set 
        {
            TimeSpan ts;
            if (TimeSpan.TryParse(value.Parameter, out ts))
            {
                _Maximum = ts;
                _MaximumProperty = value;
            }
        }
    }

    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        string formattedValue = value.ToString();
        if (Regex.IsMatch(formattedValue, @"^\d{4}$"))
        {
            formattedValue = string.Format("{0}:{1}", formattedValue.Substring(0, 2), formattedValue.Substring(2, 2));
        }
        TimeSpan convertedValue;
        if (TimeSpan.TryParseExact(formattedValue, "g", System.Globalization.CultureInfo.CurrentCulture, out convertedValue))
        {
            if (convertedValue > _Maximum)
            {
                return new ValidationResult(false, string.Format("Time must be before {0}.", _Maximum.ToString("g")));
            }
            else if (convertedValue < _Minimum)
            {
                return new ValidationResult(false, string.Format("Time must be after {0}.", _Minimum.ToString("g")));
            }
            return ValidationResult.ValidResult;
        }
        else
        {
            return new ValidationResult(false, string.Format("'{0}' is not a valid time entry.", value.ToString()));
        }
    }
}

如果我将参数设置为如下所示的静态值,则代码有效,但我需要此验证是动态的:

<local:ValidateTime.Maximum>
    <local:ValidationParameter Parameter="12:00" />
</local:ValidateTime.Maximum>
4

3 回答 3

0

首先你想给你的 TextBox 一个这样的名字:

<TextBox Name="StartTime"/>

然后像这样设置验证参数:

<local:ValidateTime.Maximum>
    <local:ValidationParameter Parameter="{Binding ElementName=StartTime, Path=Text" />
</local:ValidateTime.Maximum>

如果验证像你说的那样工作,你应该一切就绪。

如果您愿意,也可以对 EndTime 文本框做同样的事情,假设您为它编写了一个工作规则

于 2016-03-23T19:30:37.127 回答
0

就我而言

<local:RangeValidation ValidationStep="UpdatedValue"/>

帮助。因此,您将 DependencyObject 作为 value(.dataitem) 传递,包括您的 Datacontext,并且无需将参数传递给 Validation。BR,丹尼尔

顺便说一句,不是我的学分,只是找到了它,但不记得是谁给出了提示 :)

于 2016-03-30T13:43:37.713 回答
0

您可能需要解决ValidationRules不在可视树或逻辑树中的事实,这会导致绑定到 和DataContext失败。ElementNameRelativeSource

于 2016-03-24T05:35:19.773 回答