2011-06-24 19 views
3

私はWPFアプリケーションを作成していますが、ビデオ再生のために1秒あたりのフレーム数を入力するためのテキストボックスがあります。このテキストボックスの値は、コードビハインドの依存関係プロパティにバインドされています(優れたデザイナーのようにMVVMをフォローしようとしています)。私の問題は、FPS値が外部で変更されたときにテキストボックスが自動的に更新されないということです。たとえば、スライダを使用して値を制御できます。依存関係プロパティの値はスライダによって正しく変更されますが、テキストボックスのテキストは決して更新されません。もちろん、GetBindingExpression(..)を使用して手動で行う必要はありません。UpdateTarget()誰かがこれが意図された機能であるかどうかを知っていますか? XAMLでWPFテキストボックスへのバインディングの更新がありません

おかげで、 マックス

のTextBoxタグ:依存関係プロパティの背後

<TextBox Text="{Binding FPS}" Name="tbFPS" FlowDirection="RightToLeft"/> 

コード:「これは問題ですが、あなたが渡すべきかどう

#region public dependency property int FPS 

    public static readonly DependencyProperty FPSProperty = 
     DependencyProperty.Register("FPSProperty", typeof(int), typeof(GlobalSettings), 
     new PropertyMetadata(MainWindow.appState.gSettings.fps,FPSChanged,FPSCoerce), 
     FPSValidate); 

    public int FPS 
    { 
     get { return (int)GetValue(FPSProperty); } 
     set { SetValue(FPSProperty, value); } 
    } 

    private static bool FPSValidate(object value) 
    { 
     return true; 
    } 

    private static object FPSCoerce(DependencyObject obj, object o) 
    { 
     return o; 
    } 

    private static void FPSChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
    { 
     //why do i need to update the binding manually? isnt that the point of a binding? 
     // 
     (obj as GlobalSettings).tbFPS.GetBindingExpression(TextBox.TextProperty).UpdateTarget(); 
    } 

    #endregion 

答えて

4

わかりません"FPSProperty"ではなくプロパティ名として "FPS"を使用します。

public static readonly DependencyProperty FPSProperty = 
    DependencyProperty.Register("FPS", typeof(int), typeof(GlobalSettings), 
    new PropertyMetadata(MainWindow.appState.gSettings.fps,FPSChanged,FPSCoerce), 
    FPSValidate); 
+0

うん、あなたの天才 –

1

また、FrameworkPropertyMetadataOptions.BindsToWayByDefaultを依存関係プロパティの登録に追加する必要がある場合は、TextBox.TextバインディングのモードをTwoWayに手動で設定する必要があります。

FrameworkPropertyMetadataOptionsを使用するには、あなたが登録にFrameworkPropertyMetaData代わりのPropertyMetadataを使用する必要があります。それだった

public static readonly DependencyProperty FPSProperty = 
    DependencyProperty.Register("FPS", typeof(int), typeof(GlobalSettings), 
    new FrameworkPropertyMetadata(MainWindow.appState.gSettings.fps, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, FPSChanged, FPSCoerce), 
    FPSValidate); 
+0

私はによって提案を実施した後、まあ、それはその作業罰金のように思えるのために感謝@ CodeNaked私は双方向バインディングがとにかくデフォルトであると思った。 –

+0

それがうまくいくなら、素晴らしい。私は、モードを明示的に設定しない限り、登録にオプションが指定されておらず、バインドが失敗した前に問題に遭遇したことを知っています。おそらく、これは4.0の変更ですか? – sellmeadog

関連する問題