DOBON.NET DOBON.NETプログラミング掲示板過去ログ

TextBox.Textプロパティと表示されているテキストに差異が生じる現象

環境/言語:[Windows 7, .NET2010 C#, WPF]
分類:[.NET]

WPFのTextBoxで全角カタカナしか入力できないような制御をしようとしています。
そこで、下記のようなViewModelを用意し
-----
public class MainWindowViewModel
{
private readonly Regex regex = new Regex("[^ア-ン]");
private string textValue1 = string.Empty;
public string TextValue2
{
get { return this.textValue2; }
set
{
if (this.textValue2.Equals(value)) return;
if (0 < this.regex.Matches(value).Count) return;

this.textValue2 = value;
}
}

XAMLでバインドしました。
-----
<TextBox Name="textBox2" Text="{Binding TextValue2, UpdateSourceTrigger=PropertyChanged}" />

-----
そうしたところ、下記のようなおかしな状態になりました。
この原因や、回避策をご存じの方がいましたら、教えて頂けないでしょうか。
お願いします。

・全角カタカナ以外を入力した時に見た目のTextBoxには、カタカナ以外が入力できてしまう。
・コード上での、textBox2.Textプロパティは、カタカナ以外の文字は入力されない。
■No30183に返信(いもさんさんの記事)

WPFはほとんど触ったことがないので回答ではないのですが
もう少し実装した内容を書かれないと現象の再現が出来ないのでは
ないでしょうか?
■No30214に返信(shuさんの記事)
RESありがとうございます。
初めのソースで、すでに7割くらいは貼り付けてるつもりでしたが
再現する用のソースを…。


MainWindow.xaml.cs
=======================================
namespace WpfApplication2
{
 using System.Windows;
 using System.Text.RegularExpressions;

 public partial class MainWindow
 {
  public MainWindow()
  {
   InitializeComponent();
  }

  private void button1_Click(object sender, RoutedEventArgs e)
  {
   MessageBox.Show(this.textBox2.Text);
  }
 }

 public class MainWindowViewModel
 {
  private readonly Regex regex = new Regex("[^ア-ンー]");
  private string textValue2 = string.Empty;

  public string TextValue2
  {
   get
   {
    return this.textValue2;
   }

   set
   {
    if (this.textValue2.Equals(value)) return;
    if (0 < this.regex.Matches(value).Count) return;

    this.textValue2 = value;
   }
  }
 }
}

MainWindow.xaml
=======================================
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:WpfApplication2"
Title="MainWindow" Height="200" Width="200">

 <Window.DataContext>
  <vm:MainWindowViewModel />
 </Window.DataContext>

 <Grid>

  <TextBox Height="23" Width="120" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="50,50,0,0"
   Name="textBox2" Text="{Binding TextValue2, UpdateSourceTrigger=PropertyChanged}" />

  <Button Height="23" Width="75" Content="Button" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="50,80,0,0"
   Name="button1" Click="button1_Click" />

 </Grid>
</Window>
初めまして
上記の実装は、textBox2.Textプロパティに全角カタカナ以外入らない用にするという実装でよいでしょうか?

それは正常な動きだと思われます

f (this.textValue2.Equals(value)) return;
if (0 < this.regex.Matches(value).Count) return;

上記の部分をデバッグでvalueに入ってきている値を見てみてください
画面で入力した値が入ってきていると思います
しかし、上記のチェック処理でtextBox2.Textプロパティには全角カタカナしか入らなくなっています

上記のような実装でできることは、プロパティに意図しない値が入力されるのを防ぐことで、TextBoxの入力を制御できるわけではありません

TextBoxに全角カタカナ以外入らないようにするには、イベント処理だったり、添付ビヘイビアだったりを使用する必要があると思います
TextBox.Text と TextValue2 はバインドしているだけで、別の値になっても構わないのですが
TextBox.Text と 表示されている値が食い違うのが気持ち悪い訳で…


MSに質問したら
・UIElement.PreviewTextInput イベントを使用。
・UIElement.PreviewKeyDown イベントを使用。
・ValidationRules を使用して、データの検証から視覚的に入力に誤りがあることをユーザーに通知するほうが推奨。

だそうです。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板