新足迹

 找回密码
 注册

精华好帖回顾

· 给孩子取英文名 (2008-7-21) applenet · SK 世界流行音乐系列之 PINK (包括 dear mr president mtv) (2008-3-4) steveking
· 自己在家做小吃——煎饼果子 (2005-1-20) 蜻蜓 · 在澳洲亲历冠状动脉被放支架的过程 (2013-1-7) lyao
Advertisement
Advertisement
查看: 1448|回复: 13

----------------关于WPF的MVVM的几个基本问题 --------------- [复制链接]

发表于 2011-8-23 20:06 |显示全部楼层
此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
今天被通知要把以前的那个WPF项目用MVVM模式改写。


从来没用过那东西,网上google了一下,例如:

http://stackoverflow.com/questio ... r-mvvm-should-i-use

http://weblogs.asp.net/thomasleb ... e-pattern-mvvm.aspx

etc, etc.


例子本身不难理解,问题是这个WPF程序就用不着model,它所要实现的就是:


1) 用.NET里的Process去运行一个exe文件,然后会产生一个.sql script;

2) 然后load那个.sql并且运行在sql server里创建一个database。

3) 运行msdb里的几个stored procedure去做一些事情

P.S. 附带建一些txt的log file



当初用WPF写(xaml+code behind)是因为winform不好看。现在要用MVVM就改写有些高射炮打蚊子的感觉啊。。。。


Anyway,像实现这样一些功能的代码,我们一般放在MVVM的哪块里呢? 原来的那些button/checkbox click的event又挪到哪里去呀?



谢谢了!
Advertisement
Advertisement

发表于 2011-8-23 22:27 |显示全部楼层
此文章由 uowzd01 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 uowzd01 所有!转贴必须注明作者、出处和本声明,并保持内容完整
这个太高级了,得双胸级别的出来解释

帮顶,正在学MVC的人飘过

发表于 2011-8-24 11:02 |显示全部楼层

回复 uowzd01 2# 帖子

此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
你真的很帅,谢谢帮顶

发表于 2011-8-24 11:04 |显示全部楼层
此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
譬如我要建立一个SQL SERVER M.. S.. 登录的界面,


我是否可以把Connection(用户名、密码、服务器名称)作为一个model,然后界面里的button event都在我的ViewModel里面?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
头像被屏蔽

禁止发言

发表于 2011-8-24 14:31 |显示全部楼层
此文章由 linkspeed 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 linkspeed 所有!转贴必须注明作者、出处和本声明,并保持内容完整
如果是于vm绑定的control,值都在vm里直接取了,不用管event。
button的click都是通过command到vm里面的。

如果都是标准操作,一般不需要管event了。
除非要做些特别的。比如textbox要定制输入的键啥的。

评分

参与人数 1积分 +3 收起 理由
BJ-KING + 3 add points first

查看全部评分

2012年度奖章获得者 2011年度奖章获得者

发表于 2011-8-24 18:48 |显示全部楼层

回复 BJ-KING 4# 帖子

此文章由 交易人生 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 交易人生 所有!转贴必须注明作者、出处和本声明,并保持内容完整
这个真是个大题目,根据你的例子胡乱一说:

view:基本上是xaml file,code behind基本上没有,但view 的datacontext 是view-model,在xaml里面指明DataContext是View-Model class,而control 的data binding 则是view-model 里的property,即使是button,也可以binding到view-model ICommand的property。

model: 估计有2部分,entity,business logic,这里的entity,无非是LoginInfo,包括server name, user name 等等; business logic 比如connection。

View-Model:是view 和model之间的数据抽象,比如有property LoginInfo, 有property ICommand ExecuteConnection,你要实现这些property,在entity property的setter里要有调用RaisePropertyChanged。

要定义wpf的textbox two way binding,所以用户在输入user name等的时候,wpf runtime 会set view-model的property,而在setter里调用了RaisePropertyChanged,所以entity也会随之改变。

你还是找些资料看吧。

[ 本帖最后由 交易人生 于 2011-8-24 17:50 编辑 ]

评分

参与人数 1积分 +4 收起 理由
BJ-KING + 4 精品文章

查看全部评分

0  to 1
Advertisement
Advertisement

发表于 2011-8-25 10:48 |显示全部楼层

回复 交易人生 6# 帖子

此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
帅哥,先来1个简单的问题:

我现在有一个View1,与之对应的是ViewModel1。我要实现点一个View1里的button,这个window关闭。

现在按钮已经都绑定好了。然后我
在ViewModel1里定义了:public event EventHandler RequestClose
在View1里定义了:
           this.DataContext = MainWindowViewModel.Current;
           MainWindowViewModel.Current.RequestClose += (s, e) => this.Close();

现在点了按钮之后ICommand Property被触发,问题是我怎么在ViewModel1里面触发它自己的RequestClose event呢?

2012年度奖章获得者 2011年度奖章获得者

发表于 2011-8-25 14:32 |显示全部楼层

回复 BJ-KING 7# 帖子

此文章由 交易人生 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 交易人生 所有!转贴必须注明作者、出处和本声明,并保持内容完整
靠,衰哥答你:把你那2行代码删掉

然后在
在view1.xaml里面

<Grid dataContext="{designInstance local:ViewMode1}">
        <Button Content="Close" Command="{Binding Path=CloseCommand}" />
</Grid>

在ViewMode1.cs里面
Public ICommand CloseCommand
{
        Get {  return new MyCommand(CloseExecute);  }
}
void CloseExecute()
{
        //close the window
}

定义mycommand class 实现ICommand interface,

Public class MyCommand<T> : ICommand
{
        readonly Action<T> _excecute;

        Public MyCommand(Action<T> execute)
        {
                If (execute == null)
                        throw new ArgumentNullException(“excecute”);
                _execute = execute;


        }

        Public void Execute(object parameter)
        {
                _execute();
        }
}


我的MyCommand没有写完,还有几个property没有实现,要理解wpf routed event和routed command.
0  to 1

发表于 2011-8-25 19:23 |显示全部楼层

回复 交易人生 8# 帖子

此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
神,其它都可以理解。问题是你ViewModel1中的这个方法:

void CloseExecute()
{
        //close the window
}

怎么实现把View1关掉? (不能用this.Close()的吧)



再次感谢!




P.S. 网上有一种doggy的做法就是在ViewModel1里面建一个View1的reference,然后选择那个.Close()。问题是这样就有违MVVM的精神啦。

[ 本帖最后由 BJ-KING 于 2011-8-25 18:24 编辑 ]
头像被屏蔽

禁止发言

发表于 2011-8-26 12:06 |显示全部楼层
此文章由 linkspeed 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 linkspeed 所有!转贴必须注明作者、出处和本声明,并保持内容完整
咦?我早上写了忘记发了?
这个事情如果需要严格按照MVVM来干的话,你需要一些库来帮忙。
mvvmlight里面是通过message来完成的。
vm发一个closeview1message,
view那里在constructor里面注册一下这个message,
等接收到了就自己关自己。

prism里面是可以用event aggregator

评分

参与人数 1积分 +4 收起 理由
BJ-KING + 4 精品文章

查看全部评分

2012年度奖章获得者 2011年度奖章获得者

发表于 2011-8-26 14:16 |显示全部楼层
此文章由 交易人生 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 交易人生 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 BJ-KING 于 2011-8-25 18:23 发表
神,其它都可以理解。问题是你ViewModel1中的这个方法:

void CloseExecute()
{
        //close the window
}

怎么实现把View1关掉? (不能用this.Close()的吧)



再次感谢!




P.S. 网上有一种doggy的做法就是在ViewMod ...


我理解错了,以为你问一般button 如何用,如果用close button的话,直接在view1.xaml里写?直接调用trigger close event.

或者你可能想在close的button trigger的时候做些事情:

在viewmodel1.cs里

public event Action RequestClose;

public virtual void Close()
{
    if (RequestClose != null)
        RequestClose();
}

void CloseExecute()
{
    //doing login or whaterver

    //close the window

    this.Close();
}

在view1.cs

viewModel1.RequestClose += ()-> { this.Close() };

[ 本帖最后由 交易人生 于 2011-8-26 14:37 编辑 ]
0  to 1
Advertisement
Advertisement

发表于 2011-8-29 10:15 |显示全部楼层

回复 linkspeed 10# 帖子

此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我看到了网上关于Light MVVM的这个solution。


可惜我当初用了Microsoft自己的那个MVVM template。上错花轿、嫁错郎啊

发表于 2011-8-29 10:35 |显示全部楼层

回复 交易人生 11# 帖子

此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
2个问题帅哥:


1)你是怎么instatiate RequestClose的?

2)我设了一个target的method,然后即使RequestClose()被触发,View1也没有close

2012年度奖章获得者 2011年度奖章获得者

发表于 2011-8-29 12:20 |显示全部楼层
此文章由 交易人生 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 交易人生 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 BJ-KING 于 2011-8-29 09:35 发表
2个问题帅哥:


1)你是怎么instatiate RequestClose的?

2)我设了一个target的method,然后即使RequestClose()被触发,View1也没有close


1)你是怎么instatiate RequestClose的?

我们是用mvvm ioc,通过register/unregister管理view的,和你的case 不一样。还是那么句话,view1的datacontext是viewmodel1,如果 (ViewModel1)View1.DataContext应当是ViewModel1的instance。产生view1 或者viewmodel1的instance,既可以在xaml,也可以在cs文件。

看这个例子,save button应当同你的应用差不多。
http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

2)如果第一个问题解决不了,第2个当然不工作。
0  to 1

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部