当对象改变我的观点时不在 wpf
Posted
技术标签:
【中文标题】当对象改变我的观点时不在 wpf【英文标题】:When object changed my view don't in wpf 【发布时间】:2014-01-11 16:59:36 【问题描述】:好的,所以我的代码隐藏中有属性public Person ActualPerson get; set;
。我这样设置DataContext
:this.DataContext = this;
。
在 XAML 中,我在 StackPanel
中绑定了 DataContext
,如下所示:DataContext="Binding ActualPerson,UpdateSourceTrigger=PropertyChanged"
。而在每个TextBlock
:Text="Binding Path=Name,UpdateSourceTrigger=PropertyChanged"
我的问题是,当我启动我的应用程序时,我的对象具有属性,并且所有 TextBlocks 都填充了数据,但是当 Person 类对象更改时,视图没有刷新值。我的 Person 类实现 INotifyPropertyChanged
。我做错了什么?我的 UserControll 类是否应该实现 INotifyPropertyChanged 而不是 Person 类?
【问题讨论】:
【参考方案1】:您的问题是您实际上并未为 ActualPerson
对象调用 PropertyChanged
,因此不会更新 DataContext
上的绑定。
public Person ActualPerson
get return this.actualPerson;
set
if (this.actualPerson == value)
return;
this.actualPerson = value;
this.OnPropertyChanged("ActualPerson");
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
编辑:
查看您的 ViewModel 和代码隐藏以了解您如何处理此问题会有所帮助。例如,如果您要设置在 UserControl
上定义的 ActualPerson 对象,则最好使用 DependencyProperty
。
public static readonly DependencyProperty ActualPersonProperty = DependencyProperty.Register(
"ActualPerson", typeof (Person), typeof (MyUserControl), new PropertyMetadata(default(Person)));
public Person ActualPerson
get return (Person) GetValue(ActualPersonProperty);
set SetValue(ActualPersonProperty, value);
【讨论】:
还要记得指定INotifyPropertyChanged接口。 好的,但是我的 Person 类实现了 INotifyPropertyChanged。所以我的代码隐藏类应该实现那个接口? 嗯,您的绑定需要以某种方式通知更改。我不会在您的代码隐藏中使用INotifyPropertyChanged
,而是使用我在编辑中添加的建议,即使用DependencyProperty
@ext
带有DependencyProperty
的选项有效,但如何?我想知道,INotifyPropertyChanged
应该在我的模型类(Person 类)中实现吗?还是 Window / UserControl 类?
INotifyPropertyChanged 应该在绑定中使用的任何类上实现,无论是 WPF 绑定还是在您希望它知道每一行的属性更改的网格之类的控件中。为了能够使用 DependencyProperty,您需要使用派生自 DependencyObject
的类,这排除了除代码隐藏之外的大多数类。你可能想看看this SO question以上是关于当对象改变我的观点时不在 wpf的主要内容,如果未能解决你的问题,请参考以下文章