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

原页面

属性变动后

源代码下载。

时间: 2024-08-01 10:42:31

WPF中多窗口共享静态属性的相关文章

php父类中访问子类的静态属性

在类中,我们可以通过self访问本类或父类中的静态属性/静态方法,可以通过parent访问父类中的静态属性/静态方法. 可我们却没有关键字从父类中的方法访问子类的静态属性,这是由于父类是先于子类创建的,所以从逻辑上来讲从父类中访问子类的静态属性并不是一个好的选择. 但有些时候我们不得不这样做,那么我们可以通过get_class()方法实现: get_class()返回的是本对象名, get_class(obj)返回的是对象obj的名, 看下面这个例子: <?php class A {    fu

【转】WPF中的窗口的生命周期

原文地址:http://www.cnblogs.com/Jennifer/articles/1997763.html WPF中的窗口的生命周期 WPF中所有窗口的基类型都是System.Windows.Window.Window通常用于SDI窗口和对话框.Window在应用程序中除了一个设计用于托管顶级内容的控件外,就别无他物了.典型的,可以混合使用标记和代码来定义一个窗口.代码如下: 在xaml页: <Window x:Class="WPFApplication1.MainWindow&

WPF中使用TextBlock的Inlines属性来完成复杂的文字内容

参考:http://blog.csdn.net/zhangjiyehandsom/article/details/5498845 1. 需求:要在一行内容中显示不同颜色以及粗细不一的字体, 解决办法:可以使用多个Label来显示这个功能,但是这个方法太笨来, 可以直接使用TextBlock的Inlines属性 例子如下:http://my.oschina.net/owen123456/blog/162190 目前正在赶项目,到时有空再回来详细书写

WPF中常用控件的属性

Source = new BitmapImage( new Uri( WangCaiConfig.GetCurrentDirectory() + imgStr, UriKind.RelativeOrAbsolute)) this.PictureImage.Source = new BitmapImage( new Uri(img, UriKind.RelativeOrAbsolute)); Canvas.Right="10": Canvas.SetRight(stateImage, 0

calendar中set方法和静态属性带来的坑

坑在哪里: 在我之前接触的一个项目中涉及到这么一项功能:每天00:00:00把某些数据移动到mongodb数据库的另一个集合中,也就是关系型数据库的表中.这个集合名是一个固定的名称加上当前的两个月前的日期所在的年和月份. 这个功能是在我接触这个项目之前就已经存在,也就是之前的同事实现的功能,写了一个java的定时任务. 那个同事如今已经不在我们公司了,但是最近却发现这个功能有些问题,数据的移动并不像预计那样,原本应该存在2月的数据却出现在了1月的表中. 坑的根源: mongodb相关的问题暂时归

WPF中设置Border的BorderThickness属性会让背景图片产生模糊感

1 <!--设置BorderThickness会让border的Background图片看起来有模糊感--> 2 <Border x:Name="border" 3 BorderBrush="{x:Null}" 4 BorderThickness="1" 5 Background="{TemplateBinding Background}" 6 RenderTransformOrigin="0.5,

WPF中窗口控件的跨线程调用

原文:WPF中窗口控件的跨线程调用 在WinForm中,我们要跨线程访问窗口控件,只需要设置属性CheckForIllegalCrossThreadCalls = false;即可. 在WPF中要麻烦一下,同样的不允许跨线程访问,因为没有权限,访问了会抛异常: 没有CheckForIllegalCrossThreadCalls 属性,怎么办? 在WPF中的窗口控件都有一个Dispatcher属性,允许访问控件的线程:既然不允许直接访问,就告诉控件我们要干什么就好了. 方法如下: private

WPF中静态引用资源与动态引用资源的区别

WPF中静态引用资源与动态引用资源的区别 WPF中引用资源分为静态引用与动态引用,两者的区别在哪里呢?我们通过一个小的例子来理解. 点击“Update”按钮,第2个按钮的文字会变成“更上一层楼”,而第1个按钮的文字没有变化. 原因是第1个按钮文字用的是静态引用资源,而第2个按钮文字用的是动态引用资源. 前台代码: <Window x:Class="PersonalLearning.StaticDynamicResourceDemo"        xmlns="http

如何监视 WPF 中的所有窗口,在所有窗口中订阅事件或者附加 UI

原文:如何监视 WPF 中的所有窗口,在所有窗口中订阅事件或者附加 UI 由于 WPF 路由事件(主要是隧道和冒泡)的存在,我们很容易能够通过只监听窗口中的某些事件使得整个窗口中所有控件发生的事件都被监听到.然而,如果我们希望监听的是整个应用程序中所有的事件呢?路由事件的路由可并不会跨越窗口边界呀? 本文将介绍我编写的应用程序窗口监视器,来监听整个应用程序中所有窗口中的路由事件.这样的方法可以用来无时无刻监视 WPF 程序的各种状态. 其实问题依旧摆在那里,因为我们依然无法让路由事件跨越窗口边界