MVVM,这个功能如何实现?

货郎大叔 2019-01-28 11:22:43
有两个页面,FirstView、FirstViewModel、SecendView、SecendViewModel
FirstViewModel有一个Student类型(实现了INotifyPropertyChanged)的属性CurrentStudent。
SecendViewModel有一个String类型的属性StuentName。
现在,要求当FirstViewModel的CurrentStudent的StuentName子属性发生更改时,SecendViewModel的StuentName能接受到更改通知。
该如何实现?
...全文
918 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
货郎大叔 2019-01-29
  • 打赏
  • 举报
回复
引用 3 楼 wanghui0380 的回复:
怎么还来,前面说了binding,绑定的是对象实例,不是什么vm1类型,vm2类型 好了,我就想问他们是不是绑定的是同一个CurrentStudent实例(请注意,是实例,不是你发了这N个贴,view1有vm1类型,怎么调用view2了vm2类型)
不是只有依赖项属性才可以使用binding吗?ViewModel是继承自ViewModelBase啊
货郎大叔 2019-01-28
  • 打赏
  • 举报
回复
看来,就只有用2楼的方法了
sp1234_maJia 2019-01-28
  • 打赏
  • 举报
回复
如果你是纯粹地 MVVM 编程,那么其实上述这个实例中,你的 Button_Click 事件会绑定到 Form1 的 ViewModel 的某一个方法上,并且在这个 ViewModel 中的方法中去导航打开 Form2 界面。实际概念是一样的,只不过这个功能代码的封装定义稍有不同。希望你能看懂这句话!
sp1234_maJia 2019-01-28
  • 打赏
  • 举报
回复
如果只能看一点代码的后,我最后再写一点代码。比如说 MVP 代码通常就会在 Form1 实例中写
void button1_click(object sender, ...... e)
{
    var f= new Form2();
    this.DataChanged += (x, e1) =>
    {
        f.数据改了(this.TheData);    //由Form1通知Form2
        f.DataEdited += (y, e2) =>
        {
            MessageBox.Show("Form2的数据改了,是"+ f.EditData);
        };
    };
    f.Show();
}
现在如果改为 MVVP,不过是把 Form1 和 Form2 的依赖关系改为它们的背后的 ViewModel 的依赖关系。例如
void button1_click(object sender, ...... e)
{
    var f= new Form2();
    this.ViewMoel.DataChanged += (x, e1) =>
    {
        f.ViewModel.数据改了(this.TheData);    //由Form1 的 ViewModel通知Form2 的 ViewModel
        f.ViewModel.DataEdited += (y, e2) =>
        {
            MessageBox.Show("Form2的数据改了,是"+ f.ViewModel.EditData);
        };
    };
    f.Show();
}
当然这里不过只是举例而已。具体两个界面对象之间什么结构关系,根据每一个系统的实际设计而定,不一定都是这样是在一个按钮事件中创建的。 但是基本概念不变,本来毫无技术可言,理解最基本的概念(MVVM 就是每一个界面背后都独立出来一个 ViewModel 以遍简化界面定义绑定)就足够了。无技术的东西为什么总是纠结呢?
  • 打赏
  • 举报
回复
比如说最简单地,假设说在一个窗体1里边点击某个列表上的某行某列单元弹出窗体2来编辑这个单元,那么这就是知道窗体1跟窗体2对象是怎么创建的,由此知道窗体2(的 ViewModel)必定依赖于 窗体1(的 ViewModel1)或者是其中的至少这个单元格。这好像是每一个 WinForm 编程入门书上的都有的吧?只不过那些书上是 MVP,所以是按照窗体之间的依赖关系来编程,而不是写成两个窗体所绑定的 ViewModel 之间的依赖关系来编程而已。基本的两个对象之间的关系不明确,只纠结个别语句,就无法真正编程。
  • 打赏
  • 举报
回复
引用 4 楼 货郎大叔 的回复:
在Student类中加个更新委托吗,然后在StuentName属性的Set部分调用吗?
具体什么叫做“在StudengName属性的 Set部分调用”呢?这个 StudentName 属性需要有 Set 方法吗? 确立两个实在的实体之间的联系,是纠结c#编程语句的皮毛,还是搞清楚实际在哪里创建实体的?
  • 打赏
  • 举报
回复
你的 FirstViewModel 和 SecondViewModel 之间是什么关系?难道说没有关系? 如果说一个汽车的车灯打开的时候驾驶员的指示灯也应该点亮,那么就说这两个东西分别是在汽车这个ViewModle上有联系的,由事件联动的。不是什么单摆浮搁的两个ViewModel。如果说整体 ViewModel与各个部分ViewModel的关系,始终连基本概念都想象不出来,说明理科的各类模型练习问题大了。
SDHU 2019-01-28
  • 打赏
  • 举报
回复
引用 4 楼 货郎大叔 的回复:
[quote=引用 2 楼 87585 的回复:]
加个更新委托,放到propertychanged中调用

在Student类中加个更新委托吗,然后在StuentName属性的Set部分调用吗?[/quote]

可以放到set中调用,也可以重写PropertyChanged方法
货郎大叔 2019-01-28
  • 打赏
  • 举报
回复
引用 2 楼 87585 的回复:
加个更新委托,放到propertychanged中调用
在Student类中加个更新委托吗,然后在StuentName属性的Set部分调用吗?
wanghui0380 2019-01-28
  • 打赏
  • 举报
回复
怎么还来,前面说了binding,绑定的是对象实例,不是什么vm1类型,vm2类型

好了,我就想问他们是不是绑定的是同一个CurrentStudent实例(请注意,是实例,不是你发了这N个贴,view1有vm1类型,怎么调用view2了vm2类型)
SDHU 2019-01-28
  • 打赏
  • 举报
回复
加个更新委托,放到propertychanged中调用
货郎大叔 2019-01-28
  • 打赏
  • 举报
回复
有知道的么…………MVVMLight呢,如何实现

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧