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));
}

编辑:我需要实现 aDependencyProperty因为我正在创建自己的控件。

4

2 回答 2

10

您永远不会到达 setter,因为它是依赖属性的 CLR 包装器,它被声明为从外部源设置,例如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

你不应该在DependencyProperty这里使用!

您的 TextBox 的Text属性是 aDependencyProperty并且是您绑定的目标您的 Username 属性是源并且应该是 a DependencyProperty!它应该是引发NotifyPropertyChanged的​​普通旧属性。

所有你需要的是:

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

(除此之外:您只需要在编写自己的控件时使用 DependencyProperties。)

于 2013-04-18T01:26:32.667 回答