1

我在绑定到新控件的依赖属性时遇到问题。
我决定编写一些测试来检查这个问题。

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

XAML 代码:

<TextBox Name="Test" Text="{Binding ElementName=Test2, Path=Text, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Name="Test2" Grid.Row="2" />

结果很好 - 当我在第一个 TextBox 中写东西时 -> 第二个 TextBox 正在更新(反之亦然)。

在此处输入图像描述

我创建了新控件-> 例如具有依赖属性“SuperValue”的“SuperTextBox”。

控制 XAML 代码:

<UserControl x:Class="WpfApplication2.SuperTextBox"
             ...
             Name="Root">
    <TextBox Text="{Binding SuperValue, ElementName=Root, UpdateSourceTrigger=PropertyChanged}" />
</UserControl>

后面的代码:

public partial class SuperTextBox : UserControl
{
    public SuperTextBox()
    {
        InitializeComponent();
    }

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

    public string SuperValue
    {
        get { return (string)GetValue(SuperValueProperty); }
        set { SetValue(SuperValueProperty, value); }
    }
}

好的,现在测试!

从 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:问题很长,很抱歉,但我尝试准确描述我的问题。

4

3 回答 3

1

将绑定模式更改为 TwoWay。

于 2012-10-20T16:47:13.103 回答
1

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

编辑

  • 第一个案例在幕后工作,xaml 挂钩到 AddValueChangedPropertyDescriptor. 由于它工作的原因,请参阅此处的链接。
于 2012-10-20T17:26:09.327 回答
1

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

要解决此问题,您可以像这样添加FrameworkPropertyMetadataOptions.BindsTwoWayByDefaultSuperValue's元数据:

public static readonly DependencyProperty SuperValueProperty = DependencyProperty.Register(
    "SuperValue",
    typeof(string),
    typeof(SuperTextBox),
    new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)
);
于 2012-10-20T18:06:14.897 回答