usercontrol的数据绑定不会更新源模型

时间:2015-07-21 00:05:39

标签: c# wpf xaml

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

我已尝试将绑定模式设置为“TwoWay”,但它不会改变任何内容。有什么我做错了吗?

编辑:傻傻的我!事实证明,我不得不在两个绑定上放置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();
    }

}

}

1 个答案:

答案 0 :(得分:0)

默认情况下,您忘记将文本属性绑定为双向,因此您需要更改此部分:

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

或将text属性的FrameworkPropertyMetadata更改为:

new FrameworkPropertyMetadata
{
    DefaultValue = null,
    BindsTwoWayByDefault = true
}