用户控件的数据绑定不会更新源模型

本文关键字:更新 模型 控件 数据绑定 用户 | 更新日期: 2023-09-27 18:03:45

我试图实现一个自定义文本框,其中有一个占位符文本。模型的'FirstName'属性的内容按预期出现在文本框中。我遇到的问题是,当我更改文本框的文本时,它不会在源模型中更新。为什么呢?

我试过将绑定模式设置为"two - way",但它没有改变任何东西。我做错了什么吗?

编辑:我真傻!事实证明,我必须将Mode="TwoWay"放在两个绑定上,而不仅仅是用户控件的绑定上。我会尽快标记回答。

Model.cs

public class Student
{
    public string FirstName { get; set; }
}

MainWindow.xaml

<grid>
    <ui:prettyTextbox Text="{Binding FirstName}" PlaceholderText="#Enter your name">
</grid>

PrettyTextbox.xaml

<UserControl x:Name="prettyTextbox">
    <Grid>
        <TextBlock Text="{Binding Path=PlaceholderText, ElementName=prettyTextbox}"
                       Visibility="{Binding Path=Text, ElementName=prettyTextbox, Converter={StaticResource StringLengthToVisibilityConverter}}"/>
        <TextBox Text="{Binding Path=Text, ElementName=prettyTextbox, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
    </Grid>
</UserControl>

PrettyTextbox.xaml.cs

public partial class PrettyTextbox : INotifyPropertyChanged
{
    public static readonly DependencyProperty PlaceholderTextProperty =
            DependencyProperty.Register("PlaceholderText", typeof (string),
                                        typeof(PrettyTextbox), new FrameworkPropertyMetadata(default(string)));
    public string PlaceholderText
    {
        get { return (string)GetValue(PlaceholderTextProperty); }
        set
        {
            SetValue(PlaceholderTextProperty, value);
            OnPropertyChanged();
        }
    }

    public static readonly DependencyProperty TextProperty =
        DependencyProperty.Register("Text", typeof(string),
                                    typeof(PrettyTextbox), new FrameworkPropertyMetadata(default(string)));
    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set
        {
            SetValue(TextProperty, value);
            OnPropertyChanged();
        }
    }
    public PrettyTextbox()
    {
        InitializeComponent();
    }
}

}

用户控件的数据绑定不会更新源模型

您忘记在默认情况下将text属性绑定为两种方式,因此您需要更改这部分:

<ui:prettyTextbox Text="{Binding FirstName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

或将text属性的FrameworkPropertyMetadata更改为:

new FrameworkPropertyMetadata
{
    DefaultValue = null,
    BindsTwoWayByDefault = true
}
相关文章: