美文网首页
MVVM模式--游戏地图编辑器开发随笔(2)

MVVM模式--游戏地图编辑器开发随笔(2)

作者: wakinpang | 来源:发表于2017-01-16 22:43 被阅读0次

    今天解决的是关于Model与数据界面绑定的问题。
    在编写一些程序的时候难免遇到需要动态绑定一些数据进一个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绑定的文件,现在View可以绑定任何ViewModel暴露出来的DP,十分方便。
    然而我们在实际运用之中经常要把一个动态变化的集合绑定到ListView或者GridView等等列表性质的东西上,这个时候ViewModel里的单个依赖属性就显得无法满足我们的需求,这个时候我们就需要C#的ObservableCollection来将需要绑定的对象打包,其中

    public ObservableCollection<T> Example;
    

    这里需要注意的是ObservableCollection只接受类对象,所以需要把要用的数据包装成一个类,再以这个类新建一个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是类中的数据,这里需要注意的是ItemTemplate与DataTemplate的使用,详细用法可以参考《深入浅出WPF》的模板一章。
    这样View就与ViewModel的数据实现了绑定。ViewModel再与Model绑定就可以完成这个数据显示的问题。

    欢迎指正。

    相关文章

      网友评论

          本文标题:MVVM模式--游戏地图编辑器开发随笔(2)

          本文链接:https://www.haomeiwen.com/subject/uagpbttx.html