PropertyChanged 不是从另一个程序集中的 class 触发的

PropertyChanged is not fired from a class in a different assembly

我有一个 class 库,它有一个实现 INotifyPropertyChanged 的基础 class (BaseViewModel) 和一个从它派生的 class (TestExternal).

我使用 Fody v4.2.1 和 PropertyChanged.Fody v2.6.1。

在 WPF 应用程序中,我使用 class 作为 DataContext。当 属性 发生变化时,它不会反映在应用程序中。但是,如果我将 class 从 class 库复制(并重命名为 TestInternal)到应用程序,属性 更改会反映在应用程序中。 class TestInternal 派生自 class 库中完全相同的 BaseViewModel

这个简化示例中的class由stringObservableCollection<string>组成。

ObservableCollection<string> 绑定到控件,添加元素 "d" 在两种情况下都正确反映在应用程序中。但是将字符串 属性 设置为 "C" 仅反映在 TestInternal class.

我需要做什么才能让它正常工作?

BaseViewModel.cs

// This class is in the class library
public class BaseViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged = (sender, e) => { };

    public void OnPropertyChanged(string name)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(name));
    }
}

TestExternal.cs

// This class is in the class library
public class TestExternal : BaseViewModel
{
    public ObservableCollection<string> UserProjects { get; set; }
    public string TestProp { get; set; }
    System.Windows.Application App;

    public TestExternal(System.Windows.Application app)
    {
        this.App = app;
        UserProjects = new ObservableCollection<string>(new List<string>() { "a", "b", "c" });
        TestProp = "A";

        Task.Factory.StartNew(() =>
        {
            Thread.Sleep(5000);
            App.Dispatcher.Invoke((Action)delegate
            {
                TestProp = "C";
                UserProjects.Add("d");
            });
        });
    }
}

TestInternal.cs

// This class is in the WPF app project
public class TestInternal : BaseViewModel
{
    public ObservableCollection<string> UserProjects { get; set; }

    public string TestProp { get; set; }

    System.Windows.Application App;

    public TestInternal(System.Windows.Application app)
    {
        this.App = app;
        UserProjects = new ObservableCollection<string>(new List<string>() { "a", "b", "c" });
        TestProp = "A";

        Task.Factory.StartNew(() =>
        {
            Thread.Sleep(5000);
            App.Dispatcher.Invoke((Action)delegate
            {
                TestProp = "C";
                UserProjects.Add("d");
            });
        });
    }
}

XAML

<TextBlock Text="{Binding TestProp}" Style="{StaticResource NaviHeading}" />

为了让 Fody 注入到外部组件中,您必须指定适当的编织器。

指示在项目级别使用的 运行 文件和 FodyWeavers.xml 文件的顺序。需要手动添加。它采用以下形式:

<Weavers>
    <PropertyChanged />
</Weavers>

https://github.com/Fody/PropertyChanged#add-to-fodyweaversxml