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);
    }
}