2

ユーザーがたとえば310312と入力して、datepickerのtextプロパティを31/03/12に自動的に更新できるようにしたいと思います。以下のように、datepickerをビューモデルの「Date」プロパティにバインドしました。

WPF4.0では、バインディングはセットの後に自動的にgetを実行するようになりました(INotifyPropertyChangedは必要ありません)。これは以下のコードで発生していますが、「get」日付フィールド値は正しい「31/03/12」ですが、datepickerテキストプロパティは更新されておらず、310312(NB UpdateSourceTrigger = PropertyChanged)のままです。

textboxプロパティは変更されます(たとえば、表示されていない設定コードが大文字に変換される場合)

これがなぜであるかについて、私は本当にいくつかの指針をいただければ幸いです。

       <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;                    
            }
        }
4

1 に答える 1

0

これは明確な答えではありませんが、コードを投稿してフォーマットしたかったので、ここに配置しました。

これに興味をそそられたので、簡単なテスト プロジェクトをいじってみました。これが私のコードです:

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 に関係なく) 更新されません。そしてエンターキーを押します。これは、コントロールの望ましい動作のように思えます。

コントロールのフォーマットが現在のスレッドのカルチャ情報に基づいていることは知っていますが、このリンク http://social.msdn.microsoft.com/Forums/en/wpf/thread/f065bcda-a5df-4fd1-bd29-3d0186245c8cをたどると、あなたに合った解決策をまだ見つけることができません。

于 2012-04-09T19:01:39.497 に答える