3

私は を持っていて、TextBoxそれを にバインドしようとしていDependencyPropertyます。プロパティは、ロード時または入力時に変更されることはありませんTextBox。私は何が欠けていますか?

XAML

<UserControl:Class="TestBinding.UsernameBox"
        // removed xmlns stuff here for clarity>
    <Grid>
        <TextBox Height="23" Name="usernameTextBox" Text="{Binding Path=Username, ElementName=myWindow, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
    </Grid>
</UserControl>

C#

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

    public string Username
    {
        get
        {
            // Control never reaches here
            return (string)GetValue(UsernameProperty);
        }
        set
        {
            // Control never reaches here
            SetValue(UsernameProperty, value);
        }
    }

    public static readonly DependencyProperty UsernameProperty
        = DependencyProperty.Register("Username", typeof(string), typeof(MainWindow));
}

編集:DependencyProperty独自のコントロールを作成しているため、実装する必要があります。

4

2 に答える 2

10

依存関係プロパティの CLR ラッパーであるため、setter に到達することはありませんmainWindow.Username = "myuserName";。プロパティがバインドによって設定され、それが変更されたかどうかを確認したい場合、またはを使用PropertyMetadataして宣言に追加するだけではありませんPropertyChangedCallback。たとえば、次のようになります。

public static readonly DependencyProperty UsernameProperty =
            DependencyProperty.Register("Username", typeof(string), typeof(MainWindow), new UIPropertyMetadata(string.Empty, UsernamePropertyChangedCallback));

        private static void UsernamePropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            Debug.Print("OldValue: {0}", e.OldValue);
            Debug.Print("NewValue: {0}", e.NewValue);
        }

このコードを使用すると、VS の出力ウィンドウにプロパティの変更が表示されます。

コールバックの詳細については、依存関係プロパティのコールバックと検証をご覧ください。

お役に立てれば。

于 2012-12-06T08:25:28.977 に答える
3

ここでa を使用するべきではありませんDependencyProperty

TextBox のTextプロパティは でDependencyPropertyあり、バインディングのターゲットです。ユーザー名プロパティはソースであり、同様にすべきではありません! NotifyPropertyChangedDependencyPropertyを発生させる単純な古いプロパティである必要があります。

あなたに必要なのは:

private string _username;
public string Username
{
    get
    {
        return _username;
    }
    set
    {
        _username = value;
         NotifyPropertyChanged("Username");
    }
}

(余談: DependencyProperties を使用する必要があるのは、独自のコントロールを作成する場合のみです。)

于 2013-04-18T01:26:32.667 に答える