Yuan Yijun (bbbush) wrote,
Yuan Yijun
bbbush

过年后一直在学用WPF

WPF 用 XAML 来写,再加上 LINQ 表达式有种 XSLT 的味道,再加上 WPF 的模型与 XSLFO 类似:这个工作对我来说还真是挺对口的。

不过魔鬼在细节里,所以还是折腾了很久。目前还在转变观念中,MVVM
解耦得太厉害,吹捧它的文章都有点过火了,可是并不是什么地方都合适:那么什么模式适合什么呢?最好是什么模式和工具都可以灵活运用,那就不是几个月能搞定的事情了。

WPF 的优势:强调对数据/命令的呈现应当解耦合,拥有完整的系统。这样系统地学习一个东西,希望对以后做其他的开发有所帮助。


byuan: 我用 DataTemplate 绘制数据,必要的时候创建自定义控件。问题就是没法定位用 DT 创建的控件.. 在事件处理时得找来找去的。
jxie: 这没问题, 我也发现很多wpf做的东西也是这样, 都是 datetemplate作出来的. 只是做的过程是不是麻烦一些,
vs里没办法一边编辑就可以直接看到显示效果, 呵呵
byuan: 呵呵,我一直没有用那个,都是直接改 xaml,我机器太慢了
jxie: ...这是vs的一个优势呀...
jxie: 习惯问题,这个倒是好办
byuan: 那个 ViewModel 通常是用 DataContext 变量来传递的,如果是 DT 的话。
jxie: 另外, 做的那些控件, 能否做到像那些第三方控件库一样, 很方便的在xaml里用, 比如<ctrl:ribbonbutton name="aaaa" click="Click_Func">
jxie: 这样就会很像标准控件, 使用起来很方便
byuan: RibbonButton 是个 VM,所以不可能有事件..
byuan: 如果要写 Click=... 就必须创建一个自定义控件,用 RibbonButton 来做
DataContext,不过这种时候应该定义自己的 VM 类。我是这样理解的。
jxie: 是否可以提供个封装, 把你说这个VM跟具体的button control绑定起来, 外部用户方便使用
jxie: 好像你的ribbon上也是有个RibbonButton的东西来体现这些个按钮的
byuan: 不用再封装啊,我调用的时候就是一个 ContentPresenter,就像 <contentpresenter content="{StaticResource VM_FontFamilies}" />
jxie: VM应该是一个实际control的子部分
jxie: 对了
jxie: 你说这VM是指的数据逻辑部分还是说相当于DataTemplate - 描述绘制啥的
byuan: 数据逻辑
jxie: 可能我弄错了, 你说这VM是C#里对应的从ViewModelBase继承下来的那些class
byuan: DT 是胶水一样的东西,所以随便写写完事。是的,VM 是那些类,实现了 INotifyPropertyChanged
jxie: 那我就知道了
jxie: 早说是从ViewModelBase继承的撒
jxie: 不用再封装啊,我调用的时候就是一个 ContentPresenter,就像 <contentpresenter content="{StaticResource VM_FontFamilies}" />    这个时候事件怎么响应?
byuan: 听 VM 的 property changed 事件
jxie: 一个Click怎么产生property changed?
byuan: 这段时间我总感觉 VM, DT 和控件的关系是个先有鸡还是先有蛋的问题
byuan: 因为 VM 可以用 DT
byuan: 所以 VM 连是不是会有 Click 都不知道
byuan: DT 可以把 VM 呈现为任何东西
jxie: 说的很对
jxie: 控件呢? 你觉得会是怎样?
byuan: 控件就可以作为 DT 来用。要么在 DT 里引用控件,这时 DataContext 是继承的;要么直接使用控件,这时必须设置
DataContext
byuan: 在 DT 里引用控件,类似 Click 的事件只能在控件内部处理。直接使用控件时,这时可以拿到控件的引用,所以可以在外部绑事件处理程序。
jxie: 我说一句, 这里你说的控件是DT内部里用到的控件, 其实DT本身也可以作为某个自定义控件的一部分:  <yourcontrol xxxxx="XXXXX">              
byuan: o
byuan: 我一直以为这个位置只能用 ControlTemplate
jxie: 而VM就是这个自定义控件, 或者是其DataTemplate里用到的那些数据的提供者, 就像那个ItemSource啥的
byuan: 我觉得你用 ViewModel property 和构造函数来传递数据类不地道,DataContext 多好用。 :)
jxie: DataTemplate相当于展示层, 告诉用户怎么把VM里的内容表现出来. 就像你刚才说那样, 是DT来用VM,
VM本身其实很单纯, 甚至可以完全独立于DT, 就把它当成代码里定义的一个普通结构体就行
jxie: 我这是今天才想的, 还没研究这些新鲜技巧, 呵呵
jxie: 我发现WPF的设计者的确很牛, 把很多东西做的非常有意义
jxie: 以前用c++写个自定义控件那可麻烦多了
byuan: 不行,DataTemplate 不能做 Template 属性的值,除非是 ItemsControl.ItemTemplate
byuan: 那就完全不是一回事了
jxie: 等下, 我看看
byuan: 你说的把整个 Control 称为 VM 不对。这实际是 MVP 模式,也就是有一个同时知晓数据和呈现的类在那里。
byuan: 这样的确提供了封装,不像 MVVM 这么零散。
jxie: 我没说把Control当成VM
jxie: VM只是Control中数据部分的一个东东, Control还包括展现部分, 就是DT定义的,
同时Control还可以提供自定义的事件, 方法, 属性, 等等
byuan: ok
byuan: 做到最后肯定都是这样,有了完善的控件。MVVM 就是开始时可以上手快一些,因为所有东西都可以在 xaml
里做,不到绝对必要的时候不创建自定义控件。你觉得呢?
jxie: 没有控件实体, 事件处理有些麻烦
Tags: 工作
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments