今天解決的是關于Model與數(shù)據界面綁定的問題抡谐。
在編寫一些程序的時候難免遇到需要動態(tài)綁定一些數(shù)據進一個ListView或者GridView,而這些東西在MVVM中屬于View的范疇——View必定是與ViewModel通信來獲得Model的扳剿,所以在xaml文件中綁定的資源必定存在于ViewModel中,而ViewModel與View綁定全靠ViewModelLocator,名字就展示了他的功能,并且ViewModelLocator是個單獨的文件问麸,示例:
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Ioc;
using Microsoft.Practices.ServiceLocation;
namespace App.ViewModel
{
/// <summary>
/// This class contains static references to all the view models in the
/// application and provides an entry point for the bindings.
/// </summary>
public class ViewModelLocator
{
/// <summary>
/// Initializes a new instance of the ViewModelLocator class.
/// </summary>
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<AppViewModel>();
}
public AppViewModel App
{
get
{
return ServiceLocator.Current.GetInstance<AppViewModel>();
}
}
public static void Cleanup()
{
// TODO Clear the ViewModels
}
}
}
在xaml文件中與相應的控件綁定DataContext來達到定位的目的,示例:
<Window x:Class="App.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:MapEditorControl"
xmlns:vm="clr-namespace:MapEditorControl.ViewModel"
mc:Ignorable="d"
d:DesignHeight="609" d:DesignWidth="263">
<Window.Resources>
<vm:ViewModelLocator x:Key="Locator"/>
</Window.Resources>
<TabControl DataContext="{Binding Source={StaticResource Locator}, Path=App}">
<!-- TabItem...-->
</TabControl>
</Window>
這樣就解決了View與ViewModel綁定的文件钞翔,現(xiàn)在View可以綁定任何ViewModel暴露出來的DP严卖,十分方便。
然而我們在實際運用之中經常要把一個動態(tài)變化的集合綁定到ListView或者GridView等等列表性質的東西上布轿,這個時候ViewModel里的單個依賴屬性就顯得無法滿足我們的需求哮笆,這個時候我們就需要C#的ObservableCollection來將需要綁定的對象打包,其中
public ObservableCollection<T> Example;
這里需要注意的是ObservableCollection只接受類對象汰扭,所以需要把要用的數(shù)據包裝成一個類稠肘,再以這個類新建一個ObservableCollection的示例,這樣便可以綁定到View的ItemsSource上萝毛,其中以ListView為例:
<TabControl TabStripPlacement="Top"
DataContext="{Binding Source={StaticResource Locator}, Path=App}">
<TabItem Header="Test" Width="53">
<ListView ItemsSource="{Binding DataSection}">
<ListView.ItemTemplate>
<DataTemplate>
<RadioButton Content="{Binding Data}"/>
</DataTemplate>
</ListView.ItemTemplate>
<!--DynamicResource -->
</ListView>
</TabItem>
</TabControl>
DataSection便是包裝好的類對象项阴,Data是類中的數(shù)據,這里需要注意的是ItemTemplate與DataTemplate的使用笆包,詳細用法可以參考《深入淺出WPF》的模板一章环揽。
這樣View就與ViewModel的數(shù)據實現(xiàn)了綁定。ViewModel再與Model綁定就可以完成這個數(shù)據顯示的問題庵佣。
歡迎指正薯演。