我正在写一个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
答案 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);