【问题标题】:Wpf DatePicker text not updating after binding source updateWpf DatePicker 文本在绑定源更新后未更新
【发布时间】:2012-04-21 21:14:18
【问题描述】:

我希望用户能够输入例如310312 并自动将日期选择器的文本属性更新为 31/03/12;我已将日期选择器绑定到视图模型的“日期”属性,如下所示。

在 WPF4.0 中,绑定现在会在设置后自动执行获取(不需要 INotifyPropertyChanged);这发生在下面的代码中,但虽然“get”日期字段值是正确的“31/03/12”,但 datepicker 文本属性没有更新,并保持在 310312 (NB UpdateSourceTrigger=PropertyChanged)。

文本框属性确实发生了变化(例如,未显示的设置代码转换为大写)

我真的很感激一些关于为什么会这样的提示。

       <Grid>
        <DatePicker Text="{Binding Path=Date,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
            Height="25" HorizontalAlignment="Left" Name="datePicker1"/>
        <TextBox Text="{Binding Path=State,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  Height="23" HorizontalAlignment="Left"  Name="textBox1" />
    </Grid>

        private string date;
        public string Date
        {
            get
            {
                return date;
            }
            set
            {
                if (value != null)
                {
                    Regex abbreviatedDateFormat = new Regex(@"\A\d{6}\Z");
                    if (abbreviatedDateFormat.IsMatch(value))
                    {
                        value = value.Insert(2, "/");
                        value = value.Insert(5, "/");
                    }
                }

                date = value;                    
            }
        }

【问题讨论】:

  • 我想达到同样的效果。你找到解决办法了吗?

标签: wpf


【解决方案1】:

这不是一个确定的答案,但我想发布代码并对其进行格式化,所以我把它放在这里。

这引起了我的兴趣,所以我一直在玩一个简单的测试项目。这是我的代码:

MainWindow.xaml

<Window x:Class="datepickertest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" x:Name="Me">
   <StackPanel>
      <DatePicker Name="datePicker" Text="{Binding ElementName=Me, Path=Date, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

      <TextBlock Text="{Binding ElementName=datePicker, Path=Text}"/>
      <TextBlock Text="{Binding ElementName=datePicker, Path=SelectedDate}"/>
      <TextBlock Text="{Binding ElementName=Me, Path=Date}"/>
   </StackPanel>
</Window>

MainWindow.xaml.cs

public partial class MainWindow : Window
{
  public MainWindow()
  {
     Date = "030912";
     InitializeComponent();         
  }

  private string date;
  public string Date
  {
     get { return date; }
     set
        {
            if (value != null)
            {
                Regex abbreviatedDateFormat = new Regex(@"\A\d{6}\Z");
                if (abbreviatedDateFormat.IsMatch(value))
                {
                    value = value.Insert(2, "/");
                    value = value.Insert(5, "/");
                }
            }

            date = value;                    
        }
  }

}

我注意到的是,如果 DateTime 控件的输入没有用“/”字符分隔,则它们不能理解日期格式。我将 Text 属性绑定到像您一样的 TextBlock ,我可以看到它逐个字符地更新 TextBlock 并且在匹配正则表达式时它会出现斜线,但是在提供有效日期之前,实际输入框值不会更新(无论 UpdateSourceTrigger 是什么)并按下回车键。在我看来,这可能是控件的期望行为。

我知道控件的格式基于当前 Thread 的文化信息,但点击此链接 http://social.msdn.microsoft.com/Forums/en/wpf/thread/f065bcda-a5df-4fd1-bd29-3d0186245c8c,我仍然无法找到适合您的解决方案。

【讨论】:

  • 感谢您查看此内容 - 我看不出日期选择器在绑定读取视图模型值后不让绑定更新其文本的原因。我会想象绑定尝试在日期选择器上设置更改的值,但日期选择器拒绝玩球。如果是设计的话,这似乎很奇怪。
  • 我同意。我想如果我可以在构造期间设置 Text 属性绑定的值并且日期选择器输入将其拾取,您会认为在使用 set/get 组合时它的行为会相似。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
相关资源
最近更新 更多