2009-05-01 7 views
3

I持って次のセットアップでのViewModelのTextプロパティにバインドされたテキストボックス:WPFバインディングが原因で発生したPropertyChangedイベントを無視しないようにする方法

XAML

<TextBox Text="{Binding Text}"/> 

C#

public class ViewModel : INotifyPropertyChanged 
{ 
    public string Text 
    { 
     get 
     { 
      return m_Text; 
     } 
     set 
     { 
      if (String.Equals(m_Text, value)) 
      { 
       return; 
      } 

      m_Text = value.ToLower(); 
      RaisePropertyChanged("Text"); 
     } 
    } 

    // Snip 
} 

私はテキストボックスにしていくつかのものを入力しますViewModelのTextプロパティを正常に設定します。問題はWPFが独自の更新によって発生したプロパティ変更イベントを無視することです。これにより、ユーザーは、入力したテキストが小文字に変換されているのを見られなくなります。

TextBoxが小文字のテキストで更新されるようにこの動作を変更するにはどうすればよいですか?

注:これは、WPF無視イベントの問題を説明するための例です。私は文字列を小文字に変換することや、String.Equals(string、string)の問題に関心を持っていません。

答えて

2

あなたがデリゲートを定義Dispatcher.BeginInvoke

を使用して別々のディスパッチャの呼び出しでイベントを発生させることによって、これを達成することができます:

private delegate void RaisePropertyChangedDelegate(string property); 

は、イベントに

Dispatcher.CurrentDispatcher.BeginInvoke(
    DispatcherPriority.Normal, 
    new RaisePropertyChangedDelegate(RaisePropertyChanged), 
    "Text"); 
を高めるために、以下を使用します
+0

Dispatcherについて知るには、バインドされたオブジェクトが必要なので、私はこのソリューションが本当に好きではありません。しかし、それは問題を解決するので、答えとしてマークしています。 –

0

私はRocky Lhotkaが.NET Rocksの古いエピソードでこのような動作について不満を覚えています。 (30分の検索...)ああ、ここにいる。 2006年3月からEpisode 169

あなたは Windowsフォームに詳細なフォームを持っているのであれば、あなたはそれらの異なる のテキストボックスにあなたの特性 のすべてを結合して、ユーザーがテキストボックスに ものを入力してさタブをオフにすると、もちろん の値は オブジェクトに入れられますが、オブジェクトは の値を変更する可能性があります。 という種類の操作があります。すべて の文字は大文字である必要があります。それはあなたの オブジェクトに入るので、 ビジネスルールです。そうすると、UIに が表示されません。つまり、ユーザ は、小文字のa、b、c、typeを入力することができます。 タブはオフです。小文字のa、b、cは のテキストボックスに残ります。その後、後で 彼らはいくつかの他のフィールドを変更すると、 彼らは念頭に置いてオブジェクトを 大文字の値を保持しますか?そう オブジェクトは、UI C大文字のA、Bは、誤ってユーザが、そのオンオフ制御大文字 の突然A、B、Cの全て をいくつかの他の コントロールとタブを変更し、 を小文字を示している持っていますテキストボックスに が表示されていないことが表示されます。

ロッキーは実際に問題の解決策を示唆していません。もし彼がそれをうまくやっていないのであれば、いい答えがないかもしれません。おそらく、コードビハインドからオブジェクトのPropertyChangedイベントにサブスクライブし、問題のプロパティが変更されたときにバインドを手動でリフレッシュする必要があります。

ps。これはあなたの質問に直接答えるものではありませんが、あなたが与えた例では、テキストボックスにCharacterCasingを設定して、小文字しか受け付けないようにすることができます。どうやらこれは、WPFの次のバージョンで修正されて

+0

ハハ - 私はこの答えを入力してから、お茶を飲みに出かけました。私は5時間後に戻ってきて、あなたの質問を更新して、私がCharacterCasingについて話していることを先取りしているのを見てください。しかたがない。 ;-) –

0

あなたは(this post on MSDNを参照)標的結合の更新を強制する必要があります。しかし、これはWPF4で変更/壊れていたので、代わりにソースで更新を強制する必要があります(this post参照)。

関連する問題