PropertyChanged 事件未触发
PropertyChanged event not firing
我对从基地 class 触发的 PropertyChanged
事件有疑问。所以我有一个名为 MainWindowBase
的基础 class 和一个名为 SelectedItem 的 属性 和一个名为 Items 的集合,实际上派生自较低的基础 class。我填充项目,然后从派生的 class 设置 SelectedItem,它在 SelectedItem 上调用基础 class setter。 SelectedItem.PropertyChanged
处理程序永远不会在派生的 class 中调用。为什么?
class 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)
{
;
}
}
class 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
class:
public class PositionViewModel : DocumentBase
{
public string Name { get; set; }
}
DocumentBase
简单地派生自 Screen
.
感谢您查看此内容,如果您需要更多信息,请在评论中告诉我。基本上 Debug.WriteLine()
永远不会被调用,但是 MainWindowViewModelPropertyChanged()
是。在这种情况下,我只想处理特定 属性 (SelectedItem
) 的 属性 更改。
PropertyChanged
事件在 class 的 属性 被更改后触发 。或者用MSDN字:
Notifies clients that a property value has changed. [...] For example, consider a Person object with a property called FirstName.
SelectedItem
属性定义于MainWindowBase
,继承至MainWindowViewModel
。这意味着如果 SelectedItem
被更改,事件将在 class 内触发,属性 包含(在您的情况下为 MainWindowViewModel
)。
PositionViewModel
无法识别是否被选中。它的 PropertyChanged
事件仅在其内部的 属性 发生更改时才会调用。由于您没有在 class 内调用 NotifyOfPropertyChange
,这是不可能的(除了 DocumentBase
正在触发事件)。
如果您需要在选择或取消选择时执行特定操作,您可以使用 setter 调用方法。这是一个基本示例:
private TDocument selectedItem;
public TDocument SelectedItem
{
get
{
return selectedItem;
}
set
{
selectedItem?.YouAreNotSelected();
value?.YouAreSelected();
selectedItem = value;
NotifyOfPropertyChange(() => SelectedItem);
}
}
我对从基地 class 触发的 PropertyChanged
事件有疑问。所以我有一个名为 MainWindowBase
的基础 class 和一个名为 SelectedItem 的 属性 和一个名为 Items 的集合,实际上派生自较低的基础 class。我填充项目,然后从派生的 class 设置 SelectedItem,它在 SelectedItem 上调用基础 class setter。 SelectedItem.PropertyChanged
处理程序永远不会在派生的 class 中调用。为什么?
class 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)
{
;
}
}
class 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
class:
public class PositionViewModel : DocumentBase
{
public string Name { get; set; }
}
DocumentBase
简单地派生自 Screen
.
感谢您查看此内容,如果您需要更多信息,请在评论中告诉我。基本上 Debug.WriteLine()
永远不会被调用,但是 MainWindowViewModelPropertyChanged()
是。在这种情况下,我只想处理特定 属性 (SelectedItem
) 的 属性 更改。
PropertyChanged
事件在 class 的 属性 被更改后触发 。或者用MSDN字:
Notifies clients that a property value has changed. [...] For example, consider a Person object with a property called FirstName.
SelectedItem
属性定义于MainWindowBase
,继承至MainWindowViewModel
。这意味着如果 SelectedItem
被更改,事件将在 class 内触发,属性 包含(在您的情况下为 MainWindowViewModel
)。
PositionViewModel
无法识别是否被选中。它的 PropertyChanged
事件仅在其内部的 属性 发生更改时才会调用。由于您没有在 class 内调用 NotifyOfPropertyChange
,这是不可能的(除了 DocumentBase
正在触发事件)。
如果您需要在选择或取消选择时执行特定操作,您可以使用 setter 调用方法。这是一个基本示例:
private TDocument selectedItem;
public TDocument SelectedItem
{
get
{
return selectedItem;
}
set
{
selectedItem?.YouAreNotSelected();
value?.YouAreSelected();
selectedItem = value;
NotifyOfPropertyChange(() => SelectedItem);
}
}