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)效果

    原页面

    属性变动后

    源代码下载。

  • 相关阅读:
    Anagram
    HDU 1205 吃糖果(鸽巢原理)
    Codeforces 1243D 0-1 MST(补图的连通图数量)
    Codeforces 1243C Tile Painting(素数)
    Codeforces 1243B2 Character Swap (Hard Version)
    Codeforces 1243B1 Character Swap (Easy Version)
    Codeforces 1243A Maximum Square
    Codeforces 1272E Nearest Opposite Parity(BFS)
    Codeforces 1272D Remove One Element
    Codeforces 1272C Yet Another Broken Keyboard
  • 原文地址:https://www.cnblogs.com/07lyt/p/3995584.html
Copyright © 2011-2022 走看看