WPF绑定到文本框不更新

时间:2011-06-24 17:38:40

标签: c# wpf textbox binding dependency-properties

我正在写一个WPF应用程序,我有一个文本框供用户输入每秒帧数的视频播放值。此文本框的值绑定到后面的代码中的依赖项属性(尝试像一个优秀的设计师一样遵循MVVM)。我的问题是,当外部更改FPS值时,文本框不会自动更新。例如,用户可以使用滑块控制值。依赖属性值由滑块正确更改,但文本框文本永远不会更新,当然,除非我手动使用GetBindingExpression(..)。UpdateTarget(),这是我已经实现的等待更好的解决方案。有谁知道这是否是预期的功能还是我设置错误了?

谢谢, 最大

XAML中的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

2 个答案:

答案 0 :(得分:4)

不确定这是否是问题,但您应该将“FPS”作为属性名称,而不是“FPSProperty”,如下所示:

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

答案 1 :(得分: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);