WPF简单文本框绑定-从未触及依赖关系属性

slmsl1lt  于 2022-11-18  发布在  其他
关注(0)|答案(2)|浏览(171)

我有一个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,因为我正在创建自己的控件。

2vuwiymt

2vuwiymt1#

您永远无法到达setter,因为它是相依性属性的CLR Package 函数,它宣告为从外部来源设定,例如mainWindow.Username = "myuserName";。当属性是透过系结设定,而您想要查看它是否变更时,只要使用PropertyChangedCallbackPropertyMetadata加入您的宣告即可,例如:

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的输出窗口中看到属性的更改。
有关回调的更多信息,请阅读Dependency Property Callbacks and Validation
希望这对你有帮助。

gopyfrb3

gopyfrb32#

你不应该在这里使用DependencyProperty
您的TextBox的Text属性是DependencyProperty,而且是系结的 target。您的Username属性是来源,而且不应该DependencyProperty!相反,它应该是引发NotifyPropertyChanged的一般旧属性。
您所需要的只是:

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

(旁白:只有在创作自己的控件时才需要使用DependencyProperties。)

相关问题