C# 绑定到DependencyProperty而没有结果

C# 绑定到DependencyProperty而没有结果,c#,wpf,binding,user-controls,dependency-properties,C#,Wpf,Binding,User Controls,Dependency Properties,绑定到新控件的dependency属性时出现问题。 我决定写一些测试来研究这个问题。 从TextBox.Text绑定到另一个TextBox.Text <TextBox x:Name="Test1"/> <local:SuperTextBox x:Name="Test2" SuperValue="{Binding ElementName=Test1, Path=Text, UpdateSourceTrigger=PropertyChanged}" Grid.Row

绑定到新控件的dependency属性时出现问题。
我决定写一些测试来研究这个问题。

从TextBox.Text绑定到另一个TextBox.Text

    <TextBox x:Name="Test1"/>
    <local:SuperTextBox x:Name="Test2" SuperValue="{Binding ElementName=Test1, Path=Text, UpdateSourceTrigger=PropertyChanged}" Grid.Row="2"/>
XAML代码:

<TextBox Name="Test" Text="{Binding ElementName=Test2, Path=Text, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Name="Test2" Grid.Row="2" />
<UserControl x:Class="WpfApplication2.SuperTextBox"
             ...
             Name="Root">
    <TextBox Text="{Binding SuperValue, ElementName=Root, UpdateSourceTrigger=PropertyChanged}" />
</UserControl>
好的,现在开始测试

从TextBox.Text绑定到SuperTextBox.SuperValue

    <TextBox x:Name="Test1" Text="{Binding ElementName=Test2, Path=SuperValue, UpdateSourceTrigger=PropertyChanged}" />
    <local:SuperTextBox x:Name="Test2" Grid.Row="2"/>

测试也是正确的! 当我在TextBox中写入内容时,SuperTextBox正在更新。 当我在SuperTextBox中写入时,TextBox正在更新。 一切都好

现在有一个问题:
从SuperTextBox.SuperValue绑定到TextBox.Text

    <TextBox x:Name="Test1"/>
    <local:SuperTextBox x:Name="Test2" SuperValue="{Binding ElementName=Test1, Path=Text, UpdateSourceTrigger=PropertyChanged}" Grid.Row="2"/>

在这种情况下,当我在SuperTextBox中写东西时,TextBox并没有更新!

我怎样才能解决这个问题


PS:问题很长,对此我很抱歉,但我试图准确地描述我的问题。

将绑定模式更改为双向。

因为在前两种情况下,
Test1
知道何时需要自我更新,但在第三种情况下不知道。只有
Test2
知道在第三种情况下它应该何时更新。这就是为什么在第三种情况下需要双向模式的原因

编辑

  • 第一个案例是幕后工作,xaml钩住了
    AddValueChanged
    PropertyDescriptor
    公开的事件。对于 它工作的原因请参考此链接

一个有效而另一个无效的原因是,默认情况下,
TextBox
Text
依赖属性定义为双向绑定
,而您的依赖属性
SuperValue
则不是。如果除了源更新目标之外,还希望目标更新源,则需要使用双向绑定

要解决此问题,您可以将
FrameworkPropertyMetadataOptions.bindstwoway默认情况下
添加到
SuperValue的
元数据中,如下所示:

public static readonly DependencyProperty SuperValueProperty = DependencyProperty.Register(
    "SuperValue",
    typeof(string),
    typeof(SuperTextBox),
    new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)
);

谢谢这是工作!但是,为什么在第一种和第二种情况下,代码没有“Mode=TwoWay”就可以工作呢?这里有一个解释。。。文本框文本“默认”为BindingMode.TwoWay。您的属性没有。但在第一种情况下,我可以在第二个框中写入(其中没有任何关于数据绑定的信息),第一个框将被更新。更新了答案。请查查。哦,另一个案子还是不起作用。你能检查问题的新版本吗?我添加了“编辑1”部分。对不起,但我认为这两个问题非常相似,不需要创建新的“主题”。我被删除了“接受的答案”,因为它会产生“话题就是结束”的错觉。但是好的,对不起。