Dependency属性不更新UI

时间:2016-03-25 20:18:24

标签: c# data-binding dependency-properties

我是绑定概念的新手并且遇到了以下问题。

public sealed partial class MainPage : Page
{
    Model model;

    public MainPage()
    {
        this.InitializeComponent();

        model = new Model();

        this.DataContext = model;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        model.Name = "My New Name";
    }
}

class Model : DependencyObject
{
    public static DependencyProperty NameProperty = DependencyProperty.Register("Name", typeof(string), typeof(Model), new PropertyMetadata("My Name"));

    public string Name
    {
        get { return (string)GetValue(NameProperty); }
        set { SetValue(NameProperty, value); }
    }       
}

我已将Name属性绑定到TextView的Text属性。我需要做的就是,在按钮单击时,我想更新名称值,该值必须更新文本框值。我想,如果我使用依赖属性而不是普通的CLR属性,我不需要实现INotifyPropertyChanged。

但UI中的值未按预期更新。我错过了什么吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

您的问题需要解决一些问题。首先,您的模型不需要继承DependencyObject,而应该实现INotifyPropertyChanged:

public class Model : INotifyPropertyChanged
{
    string _name;
    public string Name
    {
        get { return _name; }
        set
        {
            if (_name != value)
            {
                NotifyPropertyChanged("Name");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

然后,实现INotifyProperty的对象可以用作页面/窗口/对象中的DependencyProperty:

public static readonly DependencyProperty ModelProperty = DependencyProperty.Register("Model",
        typeof(Model), typeof(MainWindow));

    public Model Model
    {
        get { return (Model)GetValue(ModelProperty); }
        set { SetValue(ModelProperty, value); }
    }

最后,您可以将TextBox.Text属性绑定到XAML中的属性:

<Grid>
    <StackPanel Orientation="Vertical">
        <TextBox Text="{Binding Name}"/>
        <Button Click="Button_Click">Click</Button>
    </StackPanel> 
</Grid>

这里仍然需要INotifyPropertyChanged,因为UI需要有一种方法来知道模型对象已经更新。