我有一个关于从基类触发PropertyChanged
事件的问题。所以我有一个名为MainWindowBase
的基类,它有一个名为SelectedItem的属性和一个名为Items的集合,实际上是在较低的基类中派生的。我填充Items,然后从派生类中设置SelectedItem,派生类调用SelectedItem上的基类setter。永远不会在派生类中调用SelectedItem.PropertyChanged
处理程序。为什么呢?
班级MainWindowViewModel
:
class MainWindowViewModel : MainWindowBase<DocumentBase>
{
public MainWindowViewModel()
{
Items.AddRange(new ObservableCollection<PositionViewModel>()
{
new PositionViewModel { Name = "Test Case 1" },
new PositionViewModel { Name = "Test Case 2" },
new PositionViewModel { Name = "Test Case 3" }
});
SelectedItem = Items.FirstOrDefault();
SelectedItem.PropertyChanged += (sender, args) =>
{
Debug.WriteLine("SelectedItem changed!");
};
PropertyChanged += MainWindowViewModelPropertyChanged;
SelectedItem = Items[1];
}
public void MainWindowViewModelPropertyChanged(object sender, PropertyChangedEventArgs e)
{
;
}
}
班级MainWindowBase
:
public class MainWindowBase<TDocument> : Conductor<TDocument>.Collection.OneActive
where TDocument : DocumentBase, new()
{
private TDocument selectedItem;
public TDocument SelectedItem
{
get
{
return selectedItem;
}
set
{
selectedItem = value;
NotifyOfPropertyChange(() => SelectedItem);
}
}
}
PositionViewModel
上课:
public class PositionViewModel : DocumentBase
{
public string Name { get; set; }
}
DocumentBase
只是源自Screen
。
感谢您查看此内容,如果您需要更多信息,请在评论中告诉我们。基本上Debug.WriteLine()
永远不会被调用,但MainWindowViewModelPropertyChanged()
是。{1}}。在这种情况下,我想只处理特定属性(SelectedItem
)的属性更改。
答案 0 :(得分:0)
在更改类的属性后触发PropertyChanged
事件。或者用MSDN字词:
通知客户端属性值已更改。 [...]例如,考虑具有名为FirstName的属性的Person对象。
SelectedItem
属性在MainWindowBase
中定义,并继承到MainWindowViewModel
。这意味着如果SelectedItem
被更改,则事件会在属性包含的类中触发(在您的情况下为MainWindowViewModel
)。
PositionViewModel
无法识别是否已选中。仅当其内部的属性发生更改时,才会调用它的PropertyChanged
事件。由于您没有在课程中调用NotifyOfPropertyChange
,因此永远不可能(除了DocumentBase
正在触发事件)。
如果您需要在选择或取消选择时执行特定操作,可以使用setter调用方法。这是一个基本的例子:
private TDocument selectedItem;
public TDocument SelectedItem
{
get
{
return selectedItem;
}
set
{
selectedItem?.YouAreNotSelected();
value?.YouAreSelected();
selectedItem = value;
NotifyOfPropertyChange(() => SelectedItem);
}
}