zoukankan      html  css  js  c++  java
  • WPF中多窗口共享静态属性

    由于我的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)效果

    原页面

    属性变动后

    源代码下载。

  • 相关阅读:
    java实现倒计时
    javaweb启动时启动socket服务端
    二进制数与十六进制数之间如何互相转换
    分组查询最新时间的数据
    javaweb利用钉钉机器人向钉钉群推送消息(解决中文乱码)
    java利用钉钉机器人向钉钉群推送消息
    Java原生操作数据库(不使用框架)
    Mybatis 插入与批量插入以及多参数批量删除
    在spring中直接在类中注入dao
    web自动化测试实战之批量执行测试用例
  • 原文地址:https://www.cnblogs.com/07lyt/p/3995584.html
Copyright © 2011-2022 走看看