我是绑定概念的新手并且遇到了以下问题。
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中的值未按预期更新。我错过了什么吗?
提前致谢。
答案 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需要有一种方法来知道模型对象已经更新。