接触MVVM接近一段时间了,有一点理解,写下来。
之前是做winform的,工作需要,学习wpf。优缺点就不用说类,网上一大堆。我自己理解的话,有下面几点:
1、首先是界面的xmal和界面分离:wpf也同样支持拖拉控件,但是使用wpf的人,都觉得在xmal中写控件更屌一点。并且可以使用静态资源(Window。Resources)设置每一个控件的样式(Style),统一界面风格更方便。Style中的TargetType指定属于某一类控件,Setter指定属性(Property)和Value。
如 <Style x:key="TxtBoxStyle" TargetType=“TextBox”>
<Setter Property="Width" Value="100" />
</Style>
Style中还可以添加Template,然后放置更多的样式模板。
2、数据绑定,可以说是MVVM的核心。界面和后台的数据交互代码,统统放置在VM(ViewModel)中,M(Model)中放置数据对象,如SQL数据库中的订单表,在Modle中就是一个对象类。V(View)是界面层。
最近做了一个DataGrid的数据绑定,列中放置了TextBox、ComboBox、Button的控件,使用数据绑定驱动控件。
DataGrid的Columns中使用DataGridTemplateColumn,可以放置TextBox等控件。并在TextBox中添加TextBoxChanged事件,引用(xmlns:ie="http://schemas.microsoft.com/expression/2010/interactivity"),
<ie:Interaction.Trigger>
<ie:EvenTrigger EventName="TextChanged">
<ie:InvokeCommandAction Command="{Binding String,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" CommandParameter="String" />
</ie:Interaction.Trigger>
在Button中直接可以使用Command和CommandParameter,CommandParameter中可以使用ElementName传递任何控件到VM层。当然这样就违背了MVVM的设计初中,但是必要情况下,也可以这么用。如在选择了DataGrid的一行中的Button,如何取得Button所在行的其他列的信息呢?把DataGrid传过去就很方便了,直接使用SelectedItem。当然也可以在V层 .cs代码中获取后传递到VM层。
在DataGrid绑定数据时,指定ItemsSource=“{Binding xxx}“,VM层中使用ObservableCollection<xxxModel> 集合,并设置OnPropertyChanged。DataGrid列中Binding对象xxModel中的属性就可以了。
如此就可以在DataGrid中显示数据。有时候这样Binding后还是不能显示数据,可能是Binding数据对象需要静态什么的。如ComboBox中绑定,这个我是设定类ComboBox类,其中有Value和Text及Guid属性,并在xxxModle(DataGrid数据源对象中)定义集合,并在集合中添加值。并且Binding时这样写(别问为为什么,也是在网上找到代码):”{Binding xxxModel.xxxCbBox},RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=DataGrid},Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}“。
Button的Visibility属性同样可以做Banding。