本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《
阿里云开发者社区用户服务协议
》和
《
阿里云开发者社区知识产权保护指引
》。如果您发现本社区中有涉嫌抄袭的内容,填写
侵权投诉表单
进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
原文:http://blog.csdn.net/leftfist/article/details/32349731
矫枉过正,从一个极端走向另一个极端。MVVM模式,View只负责呈现,虽然也有后台代码,但基本上就是摆设,VM接管了一切的逻辑处理。
那么,现在,大能的VM已经完成了所有的事情,这个窗口V如何才能自动关闭呢?
据我目前少得可怜的WPF知识可知,有两种方案:
方案一、利用View里的IsEnable属性
。
原理是这样的:
1、UI中的IsEnabled绑定VM中的属性
2、UI的后台代码中,注册IsEnableChange事件,在这个事件里,检测到传过来的值满足某个条件,即可触发Close()命令
如此,VM控制自己那个属性就能达到关闭V的目的了。
没代码我说个J8:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
IsEnabled="{Binding IsLoginFailed, Mode=OneWay}">
UI后台代码
public LoginWindow()
InitializeComponent();
this.IsEnabledChanged += LoginWindow_IsEnabledChanged;
private void LoginWindow_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
if ((bool)e.NewValue == false)
this.Close();
private bool isLoginFailed = true;
/// <summary>
/// <para>获取或设置一个表示是否登录失败的值;true表示登录失败,否则为false。</para>
/// <para>与LoginWindow的IsEnable属性绑定。当为False时,关闭Login Window。</para>
/// 当该属性更改时通知客户端。
/// </summary>
public bool IsLoginFailed
return this.isLoginFailed;
if (this.isLoginFailed != value)
this.isLoginFailed = value;
this.RaisePropertyChanged("IsLoginFailed");
方案二、用Invoke
1、UI后台代码:
public LoginWindow()
InitializeComponent();
this.DataContext = new LoginWindowVM(this.Close);
2、VM代码:
Action _closeAction;
public LoginWindowVM(Action closeAction)
InitializeLoginInfo();
this._closeAction = closeAction;
void CloseWin()
App.Current.Dispatcher.Invoke((Action)(() =>
this._closeAction.Invoke();
两种方法,无疑第一种比较符合MVVM的思想。VM发出关闭的信号,触发V进行关闭,如何关闭,何时关闭,都由V自己控制;
而方案二,通过调用的方式来直接进行关闭,好像有点越俎代庖?
但是,IsEnable本意是用来控制失效和使能的,却被用于关闭UI,反而失去了控制失效使能的作用,有时会不方便。
【HLSL学习笔记】WPF Shader Effect Library算法解读之[DirectionalBlur]
原文:【HLSL学习笔记】WPF Shader Effect Library算法解读之[DirectionalBlur]
方位模糊是一个按照指定角度循环位移并叠加纹理,最后平均颜色值并输出的一种特效。
【HLSL学习笔记】WPF Shader Effect Library算法解读之[Embossed]
原文:【HLSL学习笔记】WPF Shader Effect Library算法解读之[Embossed]
Embossed(浮雕效果)
浮雕效果主要有两个参数:Amount和Width。
【HLSL学习笔记】WPF Shader Effect Library算法解读之[BandedSwirl]
原文:【HLSL学习笔记】WPF Shader Effect Library算法解读之[BandedSwirl]
因工作原因,需要在Silverlight中使用Pixel Shader技术,这对于我来说可算是相当有难度了,首先我是个Java Web开发程序员,从来没正经地学过微软的开发语言和工具;其次,对于算法这种东西,向来有种天生的排斥,一看便头疼。
原文:WPF ViewModel与多个View绑定后如何解决的问题
当重复创建View并绑定同一个ViewModel后,ViewModel中的字段更新,在新的View中的没有反应或者在View中找不到相应的视觉树(如ListBox的ListBoxItem)
初始的解决方案:View关闭后,注销属性Unregister Dependency。
3:OneTime(只根据源来设置目标,以后都不会变)
4:OneWayToSource(与OneWay相反)
5:Default(可以单向或双向,是靠被值定的源或目标是否有get或set来指定的)
所以绑定的话是需要选上面5个中的一个模式的,根据你的需要来选择,不选的话就会自动选择第五个的。
WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参
原文:WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参
ContextMenu无论定义在.cs或.xaml文件中,都不继承父级的DataContext,所以如果要绑定父级的DataContext,直接DataContext=“{Bind...
WPF MVVM 架构 Step By Step(6)(把actions从view model解耦)
原文:WPF MVVM 架构 Step By Step(6)(把actions从view model解耦)
到现在为止,我们创建了一个简单的MVVM的例子,包含了实现了的属性和命令。我们现在有这样一个包含了例如textbox类似的输入元素的视图,textbox用绑定来和view model联系,像点击button这样的行为用命令来联系。
原文:WPF程序中的弱事件模式
在C#中,得益于强大的GC机制,使得我们开发程序变得非常简单,很多时候我们只需要管使用,而并不需要关心什么时候释放资源。但是,GC有的时并不是按照我们所期望的方式工作。
例如,我想实现一个在窗口的标题栏中实时显示当前的时间,一个比较常规的做法如下:
var...
WPF ViewModel与多个View绑定后如何解决的问题
当重复创建View并绑定同一个ViewModel后,ViewModel中的字段更新,在新的View中的没有反应或者在View中找不到相应的视觉树(如ListBox的ListBoxItem)
初始的解决方案:View关闭后,注销属性Unregister Dependency。
@winter