1

新しいコントロールの依存関係プロパティへのバインドに問題があります。
この問題を調べるために、いくつかのテストを作成することにしました。

TextBox.Text から別の TextBox.Text へのバインド

XAML コード:

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

結果は良好です-最初のTextBoxに何かを書くと-> 2番目の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); }
    }
}

OK、そして今テスト!

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

最初の 2 つのケースTest1では、自分自身を更新する必要がある時期を認識していますが、3 番目のケースでは認識していません。Test23番目のケースでいつ更新する必要があるかだけを知っています。そのTwoWayため、3 番目のケースではモードが必要です。

編集

  • 最初のケースは、バックグラウンドで動作しているため AddValueChangedPropertyDescriptor. 機能している理由については、こちらのリンクを参照してください
于 2012-10-20T17:26:09.327 に答える
1

一方が機能し、もう一方が機能しない理由は、Text依存関係プロパティがデフォルトでTextBoxバインドするように定義されているのに対し、依存関係プロパティはそうではないためです。ソースが宛先を更新するだけでなく、宛先もソースを更新するようにする場合は、TwoWay バインディングを使用する必要があります。TwoWaySuperValue

これを修正するには、次のようにメタデータに追加FrameworkPropertyMetadataOptions.BindsTwoWayByDefaultします。SuperValue'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 に答える
1

バインド モードを TwoWay に変更します。

于 2012-10-20T16:47:13.103 に答える