2012-02-25 6 views
2

ビューモデルのTimeSpanプロパティに 'twoway'というコンボボックスがバインドされていて、timespanビューのモデルプロパティを文字列に変更して分を 'm'コンボボックスの値を例えば10mから5に編集すると、私は期待しています:テキストプロパティをバインドするときの奇妙なコンボボックスの動作

WPFバインディングは、ConvertBackを呼び出してソースプロパティを更新する値を取得します。

ビューモデルのタイムスパンプロパティセッターが呼び出され、基本フィールドを設定する(10 5までのタイムスパンからの変化)、その後OnPropertyChangedを

結合WPFがイベントを受信し、したがって、最初の変換を行い、そのハンドラメソッドを呼び出しを発生させていますその値を「5m」変換した値をターゲットのテキストプロパティに設定します

最後のステップは発生せず、comboxboxは5のままです。実際にこの動作が必要ですが、理由を理解したいと思います最後のステップは起こりません。スヌープ・ユーティリティを使用して、私は次を参照してください。私はコンボボックス

UPDATEを書かれている必要があり、元の質問誤って述べたテキストボックス:奇妙なことは、テキストボックスに変化していることは、私は(すぐに5メートルに5を更新)

EDIT期待する行動を与えませんコンボボックスのテキストプロパティは5mになりますが、表示は5のままです - 私はコンボボックスが編集中であれば、テキスト表示をリフレッシュしません。 "WPFデータバインディングターゲット - 変換元を使用したソース - ターゲットサイクル"からの質問のタイトルを、現在の内容をより正確に反映するように変更しました。

答えて

0

コンバータのConvertBackメソッドは、Bindingソースプロパティの値を設定するだけで、ターゲットプロパティ(ypur TextBoxのText)は更新されません。そうすると、バインディングモードが終了するたびに無限ループが発生しますバインディングのターゲットプロパティに変更があった場合、TwoWay.Convertメソッドはソースプロパティに変更があり、ConvertBackが呼び出されたときに呼び出されます。これが役立つことを願っています。このサンプルコードは私のために動作するため

+0

おかげで - 私は思った「無限ループが」プロパティの値が変更された場合、ターゲットまたはソースを更新する前に、確認するためにチェックすることによって回避されます。これは2つのバインディングで、私の質問は本当にターゲットを更新しないconvertメソッドについてです。 – sturdytree

2

は、あなたがこの問題に直面しているあなたのサンプルコードを表示することができます -

XAML:

<TextBox Text="{Binding Time, Converter={StaticResource MyConverter}}"/> 

プロパティ

public TimeSpan Time 
{ 
    get 
    { 
     return time; 
    } 
    set 
    { 
     if (time != value) 
     { 
     time = value; 
     OnPropertyChanged("Time"); 
     } 
    } 
} 

コンバータ

public class MyConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      if (value is TimeSpan) 
      { 
       return ((TimeSpan)value).Minutes.ToString() + "m"; 
      } 
      return String.Empty; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      if (value is string) 
      { 
       return new TimeSpan(0, System.Convert.ToInt32(value), 0); 
      } 
      return new TimeSpan(); 
     } 
    } 
+0

ありがとうございました - 私は実際にコンボボックスに変更して、記述された動作を得ました(申し訳ありませんが、これは何らかの理由で私の脳にテキストボックスがありました)。テキストボックスに戻って変更すると、コードと同じ動作が得られます(私のコードはあなたのものとほとんど同じです)。コンボボックスがどう違うのですか? sturdytree

関連する問題