c# - 依赖属性绑定(bind)和更新到自定义控件——它更新,但显然不是两种方式?

标签 c# wpf data-binding mvvm dependency-properties

View 模型:

public class MyViewModel : INotifyPropertyChanged
{
    public string MyText { ... }
}

XAML:

<my:MySpecialTextBox Text="{Binding MyText}" />

自定义控件:

public class MySpecialTextBox : TextBox
{
    static MySpecialTextBox()
    {
        TextProperty.OverrideMetadata(typeof(MySpecialTextBox),
            new FrameworkPropertyMetadata
            {
                BindsTwoWayByDefault = true,
                DefaultValue = string.empty,
                PropertyChangedCallback = OnTextPropertyChanged
            });
    }

    private static void OnTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var control = d as MySpecialTextBox;

        if (control != null)
        {
            control.Text = SomeAdjustedValue((string)e.NewValue);
        }
    }
}

问题在于,虽然自定义控件中的 DependencyProperty 确实进行了适当调整,但它并未更新 ViewModel。我意识到,由于 SomeAdjustedValue 的命名,这似乎应该是 CoerceValueCallback,但 Coercion 也不会更改 ViewModel 值。如果它是 OnTextPropertyChanged 回调的触发器,我似乎无法更新我的 ViewModel 中的值......我做了一个调试跟踪,它没有第二次使用新值通过 ViewModel。不确定在这里做什么来解决这个问题。

最佳答案

在 FrameworkPropertyMetadata 中,您可以使用不同的构造函数。将其中一个与 FrameworkPropertyMetadataOptions 参数一起使用。 FrameworkPropertyMetadataOptions.BindsTwoWayByDefault 选项将默认打开双向绑定(bind),否则它只是一种方式。

编辑:所以你做到了,我应该在生病时停止尝试回答问题。

关于c# - 依赖属性绑定(bind)和更新到自定义控件——它更新,但显然不是两种方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8745483/

相关文章:

c# - Microsoft TPL(任务并行库)与 Intel TBB(线程构建 block )

c# - Unity/Firebase 如何使用 Google 进行身份验证?

wpf - 如何在 WPF 中立即暂停 SpVoice?

wpf - 如何让 MessageBox.Show() 在我的 WPF 应用程序中间弹出?

wpf - 有没有像 WPF 一样支持数据绑定(bind)的跨平台 GUI 框架?

android - 我应该在 BindAdapter 类中使用 inject 吗?

c# - 如何在 C# 中实现锁并对其进行单元测试

c# - .NET ConfigurationManager app.config 困惑

c# - 控制台应用程序中的 Application.Current "null"

android - ToggleButton 的 MvxBind 仅在发布版本中失败