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中的窗口的生命周期
原文地址:http://www.cnblogs.com/Jennifer/articles/1997763.html WPF中的窗口的生命周期 WPF中所有窗口的基类型都是System.Windows ...
- 17 webpack中babel的配置——静态属性与实例属性
// class关键字,是ES6中提供的新语法,是用来实现ES6中面向对象编程的方式 class Person{ // 使用static关键字,可以定义静态属性 // 所谓的静态属性,就是可以直接通过 ...
- PyQt(Python+Qt)学习随笔:Qt Designer中主窗口对象documentMode属性
documentMode属性表示当前主窗口是否启用文档模式,如果是则主窗口的选项卡部件会以适合操作文档的模式呈现,这类似于macOS上的文档模式. 设置此属性时,界面上不会呈现选项卡部件框架.此模式当 ...
- Wpf 中的DataGrid的Header属性,动态bind时不起作用
在使用wpf开发软件时,有使用到DataGrid,DataGridTextColumn的Header 属性使用DynamicResource binding,在修改绑定数据源时,header并没有更新 ...
- WPF中父子窗口的层次关系
关于子窗体的层级关系总结一下哈,希望能对大家有些帮助 假设有这样两个窗体:RootWindow,SubWindow,在RootWindow中引发某事件而显示SubWindow 1,如果弹出窗体(比如S ...
- WPF中XAML的触发器的属性,事件 都有那些?以及如何寻找
在编写XAML的触发器时,会有属性,事件. 那么这些都是哪里来的呢? 属性,是附加属性或者依赖属性 事件,那就是事件. 如何寻找呢? 很简单,在想要使用的触发器的对象上(也就是有光标的时候)按下F12 ...
- qt 静态库中貌似不能使用静态属性
今天一个问题搞的很郁闷,原本好好的工程,这两天加了几个类之后链接不通过了. 发现过程略去不说,最后去掉了类中的static属性,编译通过了.具体原因没时间仔细查了,反正尽量避免在静态链接库里使用sta ...
- WPF中控制窗口显示位置的三种方式
首先新建一个WPF工程,在主界面添加一个按钮,并给按钮添加点击事件button1_Click,然后新建一个用于测试弹出位置的窗口TestWindow.1.在屏幕中间显示,设置window.Window ...
- WPF中使用TextBlock的Inlines属性来完成复杂的文字内容
参考:http://blog.csdn.net/zhangjiyehandsom/article/details/5498845 1. 需求:要在一行内容中显示不同颜色以及粗细不一的字体, 解决办法: ...
随机推荐
- Flex 4 不同主题下容器子元素的管理方法
Flex 下,容器主要分两类:Spark容器, Halo容器. Spark容器 Halo容器 说明 numElements numChildern 容器的子元素数量. addElement( ) ad ...
- OpenJudge 核电站
描述 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质. 任务:对于给定的N和M,求不发生爆炸的放置核物质的方案总数 输入 只 ...
- 关于MPEG2中的图像序列和图像组头GOP
图像序列 图像序列是由图像组构成的,是随机存取段落. sequence_header_code – The sequence_header_code is the bit string ‘000001 ...
- 来自Google产品管理和营销高级副总裁Jonathan Rosenberg的42条军规(转)
#35 营造一个说 yes 的文化 你想要建立一个充满正能量和积极思考的地方.“组织里有阻碍变革发生的抗体.所以许多大公司无法创新.如果你是一个创新者,你就变成了病毒,所有的抗体都想杀死你.”在这种情 ...
- Lotus防病毒与数据备份案例
Lotus防病毒与数据备份案例 上文(http://chenguang.blog.51cto.com/350944/1334595)中我们已安装好了Domino服务器,这节里我们需要考虑安全解决方案, ...
- dedecms手机站要同步pc站的图片
首先在dede目录下面找到 /include/extend.func.php 文件 //添加自定义函数 function replaceurl($newurl){ $newurl=str_repl ...
- 使用扩展方法(this 扩展类型)
namespace ConsoleApp_UseExtendWays{ class Program { static void Main(string[] args) { Student s = ne ...
- SQL Server 之登录
1:SQL Server 是Microsoft 公司推出的关系型数据库管理系统. 安装好后,开始登录. 2:几种登录方式: (1):服务器名称: ①: . :代表本地服务器 ②: local :代表本 ...
- sqlite3里类似top的用法
sqlite3里类似top的用法 在sqlserver中使用top是很正常的,类似这样的语句: SELECT TOP 10 * FROM [index] ORDER BY id DESC; 但是很不幸 ...
- 新版本的pdo会有这个问题
新版本的pdo会有这个问题: General error: 2014 Cannot execute queries while other unbuffered queries are active. ...