PropertyChanged事件未触发

时间:2017-06-13 20:11:20

标签: c# wpf mvvm caliburn.micro inotifypropertychanged

我有一个关于从基类触发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)的属性更改。

1 个答案:

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