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由string
和ObservableCollection<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
我有一个 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由string
和ObservableCollection<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