在 WPF + MVVM +Binding + UserInput 中的 TextBox “预期格式为 DD/MM/YYYY”

Posted

技术标签:

【中文标题】在 WPF + MVVM +Binding + UserInput 中的 TextBox “预期格式为 DD/MM/YYYY”【英文标题】:In TextBox "format expected is DD/MM/YYYY" in WPF + MVVM +Binding + UserInput 【发布时间】:2019-02-16 16:11:08 【问题描述】:

我正在尝试在文本框中以指定格式输入有效日期。任何人都可以帮我验证在文本框中输入的日期是否有效,并且它的格式为 DD/MM/YYYY?

如果它不是用户输入的有效日期,则在按 Tab 后(从文本框中单击外部)它应该说:日期错误输入。

查看模型:

私人日期时间? _txtDateDeRec;

    public DateTime? TxtDateDeRec
    
        get
        
            return this._txtDateDeRec;
        
        set
        
            this._txtDateDeRec = value;
            OnPropertyChanged("TxtDateDeRec");
        
    

XAML 代码是:

TextBox x:Name="txtDateDeRec" Horizo​​ntalAlignment="Left" Height="23" Margin="555,65,0,0" TextWrapping="Wrap" Text="Binding TxtDateDeRec" VerticalAlignment="Top"宽度=“163”

【问题讨论】:

在字段上创建一个事件并尝试在 c# 中使用 Datetime 进行解析。将 DateTime.Parse 或 DateTime.TryParse 与您的 DD/MM/YYYY 格式一起使用。在这里查看dotnetperls.com/datetime-parse 和dotnetperls.com/datetime-tryparse 非常感谢,它现在可以工作了......我按照你的建议使用了。 。您可以使用 StringFormat 进行文本绑定。这适用于 MVVM 模式。 【参考方案1】:
        textBox1.Leave += new EventHandler((sender2, ee) => 
        
            var textBox = (Control)sender2;
            var date = new DateTime();
            if(DateTime.TryParse(textBox.Text,out date))
            
                textBox.Text= String.Format("0:dd/MM/yyyy", date);
            
            else
            
                textBox.Text = "date wrongly entered.";
            

        );

更新 1:仅格式 DD/MM/YYY

textBox1.Leave += new EventHandler((sender2, ee) => 
            
                var textBox = (Control)sender2;
                var date = new DateTime();
                var testResult = DateTime.TryParse(textBox.Text, out date);
                var dateToString = String.Format("0:dd/MM/yyyy", date);
                if(testResult==true && textBox.Text.Trim() == dateToString)//Format is the same
                

                    textBox.Text =dateToString ;
                

                else
                
                    textBox.Text = "date wrongly entered.";
                

            );

【讨论】:

我有 XAML。我不能这样使用。 在 xaml 或 mvvm 中我不能这样使用。【参考方案2】:

要验证日期时间格式,可以在文本框的绑定中使用验证规则。

public class DateValidation : ValidationRule 
     
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) 
         
            ValidationResult result; 
            try 
             
               Regex regex = new Regex(@"^([0]?[0-9]|[12][0-9]|[3][01])[./-]([0]?[1-9]|[1][0-2])[./-]([0-9]4|[0-9]2)$");

               DateTime? date;

               //Verify whether date entered in dd/mm/yyyy format.
               bool isValid = regex.IsMatch(value.ToString());

               //Verify whether entered date is Valid date.       
               isValid = isValid && DateTime.TryParseExact(value.ToString(), "dd/MM/yyyy", new CultureInfo("en-GB"), DateTimeStyles.None, out date);                                                                                                             

               result = isValid ? new ValidationResult(true,null) : new ValidationResult(false,"Date wrongly entered");  
            catch(Exception ) 
             
                result = new ValidationResult(false,"Date wrongly entered"); 
             
            return result; 
         
     

为文本框添加如下验证规则

<TextBox  x:Name="txtDateDeRec" HorizontalAlignment="Left" Height="23" Margin="555,65,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="163">
    <TextBox.Text>
        <Binding Path="TxtDateDeRec" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <local:DateValidation/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

【讨论】:

以上是关于在 WPF + MVVM +Binding + UserInput 中的 TextBox “预期格式为 DD/MM/YYYY”的主要内容,如果未能解决你的问题,请参考以下文章

WPF MVVM,Prism,Command Binding

WPF MVVM Binding x:Name 不触发方法

WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参

WPF ContextMenu 在MVVM模式中无法绑定 Command的解决办法

WPF MVVM--数据绑定

WPF MVVM--数据绑定