WPF中多窗口共享静态属性

由于我的DoubanFm在重新考虑之后,需要设置一个全局的CurrentSong,这个字段要让所有的VM都知道,而我同时又想把它作为我所有VM的共有属性。而且我想尽量减少代码的复制,提高重用。所以我做了以下的工作:(下面是我在WPF中的测试)

首先我们得熟悉MVVMlight框架

然后:

(1)基类

一。抽象的VM的基类

abstract class MainViewModel : ViewModelBase

二。私有静态,公有非静态暴露,还有关键点:在属性更改之后用  RaisePropertyChanged<T>把更改通过Messenger消息发送出去

 protected const string DataItemPropertyName = "DataItem";

         static private DataItem dataitem=null;

          public DataItem DataItem
{
get
{
return dataitem;
} set
{
if (dataitem == value)
{
return;
} var oldvalue=dataitem;
dataitem = value;
RaisePropertyChanged<DataItem>(DataItemPropertyName, oldvalue, value, true);
}
}

三。为子类VM提供通用注册消息的方法

          protected void RegisterVM(object vm)
{
Messenger.Default.Register<PropertyChangedMessage<DataItem>>(vm,
(message) =>
{
if(message.PropertyName==DataItemPropertyName)
RaisePropertyChanged(DataItemPropertyName); }); }

四。构造函数只在需要时给静态字段赋值(例子中只为null的静态赋值)

  protected MainViewModel(IDataService dataService)
{
_dataService = dataService;
_dataService.GetData(
(item, error) =>
{
if (dataitem == null)
{
dataitem = item;//初始化静态变量
}
});
}

(2)子类:

子类1

  public ViewModel1(IDataService  dd):base(dd)
{
RegisterVM(this);
}

  子类2

     public class ViewModel2 :MainViewModel
{ public ViewModel2(IDataService dd):base(dd)
{
RegisterVM(this);
}
}

子类3

     public class ViewModel3 : MainViewModel
{ public ViewModel3(IDataService dd)
: base(dd)
{
RegisterVM(this);
}
}

Ioc注册子类

 SimpleIoc.Default.Register<ViewModel1>();
SimpleIoc.Default.Register<ViewModel2>();
SimpleIoc.Default.Register<ViewModel3>();

(3)效果

原页面

WPF中多窗口共享静态属性

属性变动后

WPF中多窗口共享静态属性

源代码下载。

上一篇:斜率DP hdu 3507


下一篇:Wpf 中的DataGrid的Header属性,动态bind时不起作用