MVVM,跨vm如何绑定?

货郎大叔 2019-01-24 02:39:20
请问一下大神:
有两个页面,FirstView、FirstViewModel、
SecendView、SecendViewModel。
其中SecendViewModel中定义了一个属性CurrentUser。
现在FirstView的文本框需要绑定到SecendViewModel的CurrentUser.UserName上,该怎么弄?
...全文
524 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
货郎大叔 2019-01-25
  • 打赏
  • 举报
回复
引用 17 楼 ilikeff8 的回复:
简单点,要考虑可维护和可读性,大的结构就一个view对应一个cs和一个viewmodel就行了,最多把通用的东西搞个接口或父类继承啥的,或搞个通用函数库啥的直接调用或依赖注入都行,简单明了
依赖注入的话,有变更通知么,关键是这个呀
ilikeff8 2019-01-25
  • 打赏
  • 举报
回复
简单点,要考虑可维护和可读性,大的结构就一个view对应一个cs和一个viewmodel就行了,最多把通用的东西搞个接口或父类继承啥的,或搞个通用函数库啥的直接调用或依赖注入都行,简单明了
独立观察员 2019-01-25
  • 打赏
  • 举报
回复
楼主不是问过这个问题了吗?还是推荐使用依赖注入。
货郎大叔 2019-01-24
  • 打赏
  • 举报
回复
引用 11 楼 wanghui0380 的回复:
也就是说, 你临时扩展一个vm把东西包含进来没问题 你用wpf的专有技术依赖属性没问题”
临时扩展一个vm ?如何扩展一个,不是一个页面已经有一个vm了么。
wanghui0380 2019-01-24
  • 打赏
  • 举报
回复
本来微软就规定一个view配一个viewmodel
=====================
本来微软就没规定一个view配一个viewmodel

这个东西微软说那是DataSource,datacontex,微软说一个view你可以多个DataSource,多个datacontex,这个没毛病
wanghui0380 2019-01-24
  • 打赏
  • 举报
回复
引用
调用两个不同vm的实例也没问题。可不可以在FirstViewModel中定义一个SecendViewModel类型的属性呢,然后就可以很方便地访问了。如此作的话,vm之间岂不是可以随便互访问了


本来微软就规定一个view配一个viewmodel,这个我们上一个帖子已经讨论过了,view是一个或多个模型的视角片段交集的展示层

而且就你的例子来说,逻辑上除了登录用户修改自己个人信息以外,其他地方他都不应该是双向绑定,其他地方其实直接赋值给他就好

在回你上面问题,我们说当然可以一个vm里包含另个一个vm,那个只是说代码洁癖,我不是一个代码洁癖的人。我认为UI变动快就让他快,既然只是UI变化,不涉及逻辑变化,自然修改xaml就行了,干嘛修改代码(除非知道逻辑上他会左右摆动,为了更改方便,我们需要使用保留手段去防备他改动,我们会给他单独写临时vm,注意我指的是逻辑变化,而非页面变化)

代码防的是逻辑,不是防的展示。(这点玩其他的也一样,比如玩web滴,后端去拼接html还带样式,我得说样式变了,你怎么弄,他是纯UI的变动,你用代码逻辑搞?)
货郎大叔 2019-01-24
  • 打赏
  • 举报
回复
引用 11 楼 wanghui0380的回复:
也就是说,
你临时扩展一个vm把东西包含进来没问题
你用wpf的专有技术依赖属性没问题
你用一般通用的AOP属性注入没问题

甚至你啥也不用,就在一个页面view,调用两个不同vm的实例也没问题

话说我实在不想说什么vm,因为你只有把view抛开才能学会这个,只有把view抛开,你才会专注滴做逻辑。不抛开view,就只能如你一样,就view强说viewmodel----------“莫莫莫,为赋新词强说愁”
调用两个不同vm的实例也没问题。可不可以在FirstViewModel中定义一个SecendViewModel类型的属性呢,然后就可以很方便地访问了。如此作的话,vm之间岂不是可以随便互访问了
wanghui0380 2019-01-24
  • 打赏
  • 举报
回复
也就是说,
你临时扩展一个vm把东西包含进来没问题
你用wpf的专有技术依赖属性没问题
你用一般通用的AOP属性注入没问题

甚至你啥也不用,就在一个页面view,调用两个不同vm的实例也没问题

话说我实在不想说什么vm,因为你只有把view抛开才能学会这个,只有把view抛开,你才会专注滴做逻辑。不抛开view,就只能如你一样,就view强说viewmodel----------“莫莫莫,为赋新词强说愁”
wanghui0380 2019-01-24
  • 打赏
  • 举报
回复
你说你要全局一样一样。
上次说了全局的我们叫上下文,假设有个上下文管理器

我们说 Context.getContext<CurrentUser>() 有问题么?
回头去看微软最原始的定义Bindding(要绑定属性名,对象实例,对象成员名)
比如 给Textbox的Text绑定

就是 bindding("Text",Context.getContext<CurrentUser>() ,"UserName") //假设CurrentUser有个脚Username的属性

你也看到了,你只要知道要绑定到用那个对象实例的那个属性的值绑定到控件的那个属性上就好

跟你是那个vm没有任何关系,人家不管你是那个vm,只管是那个对象实例
wanghui0380 2019-01-24
  • 打赏
  • 举报
回复
为啥你始终绕不开view呢?
如果把view抛开,他也不叫viewmodel。我们根本就不想什么view。我们只说我们是“逻辑模块智能数据”成不。

说是逻辑模块------自然他是按逻辑的写的,我不管你页面上有啥,只说逻辑上应该有啥。
说是智能数据------自然是他具备双向数据绑定接口,能让你直接绑定到UI上

那好,在来说什么跨VM绑定,本来他就是“逻辑模块智能数据”,他包含了其他逻辑模块的功能没问题吧?根据课程找学生和老师没问题吧

课程
{
课程名
老师
list<学生>
}

list<课程>

好了,如果课程,学生,老师都已经实现绑定接口。那么丢到你的UI上有问题么?一个datagrid绑定list<课程>,显示课程名,显示老师,点击课程行,在下面另一个datagrid里显示学生有问题么。在点击学生,在详细页上展示学生资料有问题么?


你看到了,我们不讲view,我们只讲逻辑关系,只是实现的时候去实现一些数据绑定接口就行。
qq14923349 2019-01-24
  • 打赏
  • 举报
回复
datacontext有很多种绑定方式的 我目前碰到过千齐八怪的都有
  • 打赏
  • 举报
回复
引用 2 楼 大然然 的回复:
CurrentUser是存放当前登录用户的吧, 你把他单独弄成个全局的, FirstViewModel、SecendViewModel 各自弄个string user的属性,然后user =CurrentUser 也是可以的哦。
是的。不同的 View 设计方法,本身就应该支持将子界面绑定到全局 ViewModel 对象。假设选择的技术差,那么也可以在 ViewModel 下手动编程来代理同一个 CurrentUser。
  • 打赏
  • 举报
回复
引用 1 楼 HXXCCC 的回复:
可以定义一个基础类BaseViewModel,一些公用的属性,方法都可以放在这个类。FirstViewModel、SecendViewModel继承基础类就好了。 当然方法不止这么一个,只是个建议。
继承不是这么概念! 如果两个 ViewModel 继承自同一个 BaseViewModel,那么两个 ViewModel 也还是两个 ViewModel。不会因为两个 class 有相同的父类就说它们的实例对象也共享了!
  • 打赏
  • 举报
回复
每一个页面有一个 ViewModel,这个是“傻瓜化”的,以遍简化 View 这个皮毛的编程。你非要对皮毛搞那么技术化干嘛? 不同的 VewModel 下面如何共享什么对象,那是 ViewModel 下面的事情。根本就跟 View 绑定 ViewModel 无关。
货郎大叔 2019-01-24
  • 打赏
  • 举报
回复
可不可以在FirstView中定义一个SecendViewModel类型的属性呢,然后再说下一步…………
晨易夕 2019-01-24
  • 打赏
  • 举报
回复
在我看来,“跨ViewModel”,就不叫MVVM了。
大然然 2019-01-24
  • 打赏
  • 举报
回复
CurrentUser是存放当前登录用户的吧, 你把他单独弄成个全局的, FirstViewModel、SecendViewModel 各自弄个string user的属性,然后user =CurrentUser 也是可以的哦。
HXXCCC 2019-01-24
  • 打赏
  • 举报
回复
可以定义一个基础类BaseViewModel,一些公用的属性,方法都可以放在这个类。FirstViewModel、SecendViewModel继承基础类就好了。 当然方法不止这么一个,只是个建议。

110,539

社区成员

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

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

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