wpf - 绑定(bind)到 WPF 中的 ValidationRule

标签 wpf datetime mvvm data-binding validationrule

我是 WPF 的新手。表单的数据上下文包括 StartTimeEndTime字段(使用 MVVM),我已成功将其绑定(bind)到自己的文本框。我正在尝试创建验证以检查新用户输入的 StartTimeEndTime 之前值(value)。以下代码似乎没有绑定(bind) 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>

最佳答案

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

<TextBox Name="StartTime"/>

然后像这样设置验证参数:
<local:ValidateTime.Maximum>
    <local:ValidationParameter Parameter="{Binding ElementName=StartTime, Path=Text" />
</local:ValidateTime.Maximum>

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

如果您愿意,也可以对 EndTime 文本框执行相同的操作,前提是您为其编写了工作规则

关于wpf - 绑定(bind)到 WPF 中的 ValidationRule,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36186922/

相关文章:

wpf - 在 WPF 数据网格中使行不可聚焦

mysql - 查询 MySQL 日期时间字段中 11 个月前的任何记录

wpf - MVVM 模式 : ViewModel updates after Model server roundtrip

c# - 更新 DataGrid 从类中更新属性,该属性是绑定(bind)到 DataGrid 的 ObservableCollection 的项

c# - 选择 ComboBox 中的项目会影响不相关的 ComboBox

c# - 将值(int)设置为检查单选按钮 wpf

wpf - WPF中的多线程

c# - yyyy-dd-MM 格式日期的 DateTime.TryParse 问题

php - mysql当天总登录时间

WPF/XAML - 选中单选按钮时设置 ValidatesOnDataErrors = false/true 的 DataTriggers