(3)效果

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

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

首先我们得熟悉MVVMlight框架

然后:

(1)基类一。抽象的VM的基类abstractclassMainViewModel : ViewModelBase

二。私有静态,公有非静态暴露,还有关键点:在属性更改之后用 RaisePRopertyChanged<T>把更改通过Messenger消息发送出去1protectedconststringDataItemPropertyName ="DataItem";23staticprivateDataItem dataitem=null;456publicDataItem DataItem7{8get9{10returndataitem;11}1213set14{15if(dataitem ==value)16{17return;18}1920varoldvalue=dataitem;21dataitem =value;22RaisePropertyChanged<DataItem>(DataItemPropertyName, oldvalue, value,true);23}24}

三。为子类VM提供通用注册消息的方法1protectedvoidRegisterVM(objectvm)2{3Messenger.Default.Register<PropertyChangedMessage<DataItem>>(vm,4(message) =>5{6if(message.PropertyName==DataItemPropertyName)7RaisePropertyChanged(DataItemPropertyName);89});1011}

四。构造函数只在需要时给静态字段赋值(例子中只为null的静态赋值)1protectedMainViewModel(IDataService dataService)2{3_dataService =dataService;4_dataService.GetData(5(item, error) =>6{7if(dataitem ==null)8{9dataitem = item;//初始化静态变量10}11});12}

(2)子类: 子类1

1publicViewModel1(IDataService dd):base(dd)2{3RegisterVM(this);4}

子类2

1publicclassViewModel2 :MainViewModel2{345publicViewModel2(IDataService dd):base(dd)6{7RegisterVM(this);8}9}

子类3

1publicclassViewModel3 : MainViewModel2{34publicViewModel3(IDataService dd)5:base(dd)6{7RegisterVM(this);8}9}

Ioc注册子类

SimpleIoc.Default.Register<ViewModel1>();

SimpleIoc.Default.Register<ViewModel2>();

SimpleIoc.Default.Register<ViewModel3>();

(3)效果原页面

属性变动后

源代码下载。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航