WPF中多窗口共享静态属性
https://www.cnblogs.com/07lyt/p/3995584.html
由于我的DoubanFm在重新考虑之后,需要设置一个全局的CurrentSong,这个字段要让所有的VM都知道,而我同时又想把它作为我所有VM的共有属性。而且我想尽量减少代码的复制,提高重用。所以我做了以下的工作:(下面是我在WPF中的测试)
首先我们得熟悉MVVMlight框架
然后:
(1)基类
一。抽象的VM的基类
abstract class MainViewModel : ViewModelBase
二。私有静态,公有非静态暴露,还有关键点:在属性更改之后用 RaisePropertyChanged<T>把更改通过Messenger消息发送出去
1 protected const string DataItemPropertyName = "DataItem";
2
3 static private DataItem dataitem=null;
4
5
6 public DataItem DataItem
7 {
8 get
9 {
10 return dataitem;
11 }
12
13 set
14 {
15 if (dataitem == value)
16 {
17 return;
18 }
19
20 var oldvalue=dataitem;
21 dataitem = value;
22 RaisePropertyChanged<DataItem>(DataItemPropertyName, oldvalue, value, true);
23 }
24 }
三。为子类VM提供通用注册消息的方法
1 protected void RegisterVM(object vm)
2 {
3 Messenger.Default.Register<PropertyChangedMessage<DataItem>>(vm,
4 (message) =>
5 {
6 if(message.PropertyName==DataItemPropertyName)
7 RaisePropertyChanged(DataItemPropertyName);
8
9 });
10
11 }
四。构造函数只在需要时给静态字段赋值(例子中只为null的静态赋值)
1 protected MainViewModel(IDataService dataService)
2 {
3 _dataService = dataService;
4 _dataService.GetData(
5 (item, error) =>
6 {
7 if (dataitem == null)
8 {
9 dataitem = item;//初始化静态变量
10 }
11 });
12 }
(2)子类:
子类1
1 public ViewModel1(IDataService dd):base(dd)
2 {
3 RegisterVM(this);
4 }
子类2
1 public class ViewModel2 :MainViewModel
2 {
3
4
5 public ViewModel2(IDataService dd):base(dd)
6 {
7 RegisterVM(this);
8 }
9 }
子类3
1 public class ViewModel3 : MainViewModel
2 {
3
4 public ViewModel3(IDataService dd)
5 : base(dd)
6 {
7 RegisterVM(this);
8 }
9 }
Ioc注册子类
SimpleIoc.Default.Register<ViewModel1>();
SimpleIoc.Default.Register<ViewModel2>();
SimpleIoc.Default.Register<ViewModel3>();
(3)效果
原页面

属性变动后



浙公网安备 33010602011771号