读书人

详解“MVVM”模式实例以及对应疑问解

发布时间: 2012-06-11 17:42:22 作者: rapoo

详解“MVVM”模式实例,以及对应疑问
1.View

<UserControl x:Class="MultiChartDemo.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480"
xmlns:local="clr-namespace:MultiChartDemo"

问题一:“MultiChartDemo”命名空间的引入,是不是使该“命名空间”下所有的类都可以看得见,“MainPage”也只是其中一个子类??? 在前台“XAML”中也可以引用后台“.cs”中的类,这样做是不是浪费资源???

xmlns:vc="clr-namespace:Visifire.Charts;assembly=SLVisifire.Charts">
<UserControl.DataContext >
<local:MainPageViewModel />

</UserControl.DataContext>

问题二:“UserControl.DataContext”就是关联“View”和“ViewModel”之间的桥梁对吧??? 这样“ViewModel”中的“实体集数据”就可以绑定到“View”了对吧??? 但“增、删、改、查”这些事件应该怎样绑定呢,只是知道使用“Command”???绑定这些“Command”事件,是不是比“控件自带事件”消耗资源???

<UserControl.Resources >
<local:SeriesTemplateSelector x:Key="chartTemplateSelector">

问题三:“SeriesTemplateSelector”是一个“.xaml.cs”后台类,为什么可以被前端“xaml”使用呢??? 怎么回事???

<local:SeriesTemplateSelector.SalesTemplate>
<DataTemplate >
<vc:DataSeries RenderAs="Line" LegendText="{Binding SalesName}" DataSource="{Binding SalesTotals}" >
<vc:DataSeries.DataMappings>
<vc:DataMapping MemberName="AxisXLabel" Path="Date" ></vc:DataMapping>
<vc:DataMapping MemberName="YValue" Path="SalesTotal" ></vc:DataMapping>
</vc:DataSeries.DataMappings>
</vc:DataSeries>
</DataTemplate>
</local:SeriesTemplateSelector.SalesTemplate>

<local:SeriesTemplateSelector.MedianTemplate>
<DataTemplate>
<vc:DataSeries RenderAs="Column" LegendText="{Binding SalesName}" DataSource="{Binding SalesTotals}" >
<vc:DataSeries.DataMappings>
<vc:DataMapping MemberName="AxisXLabel" Path="Date" ></vc:DataMapping>
<vc:DataMapping MemberName="YValue" Path="SalesTotal" ></vc:DataMapping>
</vc:DataSeries.DataMappings>
</vc:DataSeries>
</DataTemplate>
</local:SeriesTemplateSelector.MedianTemplate>

</local:SeriesTemplateSelector>

</UserControl.Resources>

<Grid x:Name="LayoutRoot">

<StackPanel Orientation="Vertical" >

<!-- ======================================= 1st Chart ================================== -->

<local:MultiChart SeriesSource="{Binding SalesData}" Height="220" Width="400" Margin="0,5,0,0">

问题四:“public class MultiChart : Visifire.Charts.Chart” ,“MultiChart”继承自第三方“Visifire”下“Chart”,为什么不直接使用“Visifire”下“Chart”,而是将其继承一下呢???这样做有什么好处???

<local:MultiChart.Titles>
<vc:Title Text="Dynamic Multi Lines"></vc:Title>


</local:MultiChart.Titles>

<local:MultiChart.SeriesTemplate >
<DataTemplate >

<vc:DataSeries RenderAs="Line" LegendText="{Binding SalesName}" DataSource="{Binding SalesTotals}">
<vc:DataSeries.DataMappings>
<vc:DataMapping MemberName="AxisXLabel" Path="Date" ></vc:DataMapping>
<vc:DataMapping MemberName="YValue" Path="SalesTotal" ></vc:DataMapping>
</vc:DataSeries.DataMappings>
</vc:DataSeries>

</DataTemplate>
</local:MultiChart.SeriesTemplate>

</local:MultiChart>


<!-- ======================================= 2nd Chart ================================== -->


<local:MultiChart SeriesSource="{Binding SalesDataWithMedian}" SeriesTemplateSelector="{StaticResource chartTemplateSelector}" Height="220" Width="400" Margin="0,10,0,0">

<local:MultiChart.Titles>
<vc:Title Text="Dynamic Multi Lines with different DataTemplates"></vc:Title>
</local:MultiChart.Titles>

</local:MultiChart>

</StackPanel>
</Grid>
</UserControl>


[解决办法]
我说上次那位老兄的那种“所谓的分享“,“所谓的教程”会引出毛病。如今看来果真如此

我倒过来说把:

问题8 和问题6 相关
问题6,原本是实现INotifyPropertyChanged的一个过程,他本身应该调用PropertyChanged(this, new PropertyChangedEventArgs(propertyName));写那篇“教程”的人认为手写propertyName会出现手误,也很麻烦,所以他用Exrpression表达式包装了一下(也就是问题8处),产生了所谓自动生成propertyName字符串的技巧(问题6调用问题8产生字符串)
================================
注:这么做,无可无不可,不过是形式主义,其实PropertyChanged事件本身根本不需要propertyName字符串,从目前微软所有的过程来看,这个值从来就没使用过,暂时就是一个冗余项,所以常规情况下无需如此包装
=================================


问题七:除了实现“INotifyPropertyChanged”接口,“ViewModelBase类”还有其它什么作用???

对他这个也就只起了这个作用
==================================

问题五:是因为“UserControl.DataContext ”加载此“ViewModel”的时候就调用了此“构造方法”,然后执行“Updata()”对吧??? 如果将“UpdateData()”方法绑定到前端按钮,应该怎样做???
答案: 如果你别管啥MVVM,如果是一普通的类XX.UPdata()方法,你前端是怎么调用他的?你平时怎么做就怎么做

至于前4项,那是wpf的专项我就不回答了,看后面专门玩wpf的答案

读书人网 >C#

热点推荐