首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

详解“MVVM”模式实例,以及对应疑问解决方案

2012-06-11 
详解“MVVM”模式实例,以及对应疑问1.ViewUserControl x:ClassMultiChartDemo.MainPagexmlnshttp://sc

详解“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的答案

热点排行