使用mvvmlight for win8 让GridViewItem项 实现动态命令导航
2012-11-12 22:04
375 查看
前言:
该技术前提是 已经掌握一定程度的mvvmlight for win8 技巧
实现思路:
通过Messenger 机制 动态发送导航参数 到 需要导航的page 完成导航
导航参数:
[csharp]
view plaincopyprint?
public class NavigateParameter
{
private string pageType;
public string PageType
{
get { return pageType; }
set { pageType = value; }
}
private object parameter;
public object Parameter
{
get { return parameter; }
set { parameter = value; }
}
}
在 OnNavigated 到首页的地方 加入以下方法 注册 该处理通道
[csharp]
view plaincopyprint?
protected override
void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
this.prContent.IsIndeterminate =
true;
this.ContentFrame.Navigate(typeof(MainPage));
this.TopFrame.Navigate(typeof(VideosPage));
#region Messengers 消息处理中心
Messenger.Default.Register<NavigateParameter>(this,
"MenuNavigate", async s =>
{
var type = await Task.Run<Type>(() =>
{
var fullName = "IntTourism.View." + s.PageType;
return Type.GetType(fullName);
});
if (null != s.Parameter)
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () =>
this.ContentFrame.Navigate(type, s.Parameter));
else
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () =>
this.ContentFrame.Navigate(type));
});
Messenger.Default.Register<NavigateParameter>(this,
"TopFrameNavigate", async s =>
{
var type = await Task.Run<Type>(() =>
{
var fullName = "IntTourism.View." + s.PageType;
return Type.GetType(fullName);
});
await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () =>
{
if (!TopFrame.CurrentSourcePageType.Equals(type))
if (null != s.Parameter)
this.TopFrame.Navigate(type, s.Parameter);
else
this.TopFrame.Navigate(type);
});
});
#endregion
}
Unloaded 注销
[csharp]
view plaincopyprint?
private void LayoutAwarePage_Unloaded(object sender, RoutedEventArgs e)
{
Messenger.Default.Unregister<NavigateParameter>(this,
"MenuNavigate");
Messenger.Default.Unregister<LogBean>(this,
"LogError");
Messenger.Default.Unregister<LogBean>(this,
"TopBusy");
Messenger.Default.Unregister<LogBean>(this,
"ContentBusy");
Messenger.Default.Unregister<LogBean>(this,
"TopFrame");
this.btnCancel.PointerPressed -= SendError;
this.btnSend.PointerPressed -= SendError;
}
以下为xaml 里 gridview 菜单的binding方式
注意:ItemClick 此处通过eventTocommand 将事件与 viewmodel中相应的命令进行了binding处理 请结合我上一篇文章 对EventTocomand这一概念进行理解
[html]
view plaincopyprint?
<common:LayoutAwarePage
x:Class="IntTourism.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"
xmlns:i="using:IntTourism.Com.Transvalue.Tools"
xmlns:ignore="http://www.ignore.com"
xmlns:common="using:IntTourism.Common"
xmlns:cmd="using:IntTourism"
mc:Ignorable="d ignore"
d:DesignHeight="1080"
d:DesignWidth="1080"
DataContext="{Binding Main, Source={StaticResource Locator}}"
NavigationCacheMode="Required">
<Viewbox>
<Grid
Width="1080"
Height="1080"
x:Name="root">
<GridView
HorizontalAlignment="Left"
VerticalAlignment="Top"
Width="1080"
Height="1080"
CanDragItems="false"
IsRightTapEnabled="False"
ScrollViewer.HorizontalScrollBarVisibility="Hidden"
IsSwipeEnabled="False"
x:Name="gv"
ItemsSource="{Binding MenuItems}"
SelectionMode="None"
>
<GridView.Transitions>
<TransitionCollection>
<EntranceThemeTransition/>
</TransitionCollection>
</GridView.Transitions>
<GridView.ItemContainerTransitions>
<TransitionCollection>
<EntranceThemeTransition/>
</TransitionCollection>
</GridView.ItemContainerTransitions>
<GridView.HeaderTransitions>
<TransitionCollection>
<EntranceThemeTransition/>
</TransitionCollection>
</GridView.HeaderTransitions>
<GridView.ItemTemplate>
<DataTemplate>
<GridViewItem>
<Image
Height="280"
Width="280"
Source="{Binding IconUrl}"/>
<i:EventToCommandCollection.Items>
<i:EventToCommand
Command="{Binding MenuCMD}"
CommandParameter="{Binding NavigateParameter}"
NavigateUrl="{Binding NavigateUrl}"
Event="ItemClick"/>
</i:EventToCommandCollection.Items>
</GridViewItem>
</DataTemplate>
</GridView.ItemTemplate>
<GridView.ItemsPanel>
<ItemsPanelTemplate>
<VariableSizedWrapGrid
Orientation="Vertical"
Margin="0,0,80,0"
ItemWidth="300"
ItemHeight="300"
MaximumRowsOrColumns="10"/>
</ItemsPanelTemplate>
</GridView.ItemsPanel>
</GridView>
</Grid>
</Viewbox>
</common:LayoutAwarePage>
下面这一段是ViewModel中对命令的处理,以及菜单的动态加载
[csharp]
view plaincopyprint?
using GalaSoft.MvvmLight;
using IntTourism.Com.Transvalue.Service;
using GalaSoft.MvvmLight.Command;
using System.Diagnostics;
using Windows.UI.Xaml.Controls;
using System.Collections;
using System.Collections.ObjectModel;
using IntTourism.Com.Transvalue.Model;
using GalaSoft.MvvmLight.Messaging;
using System;
using System.ComponentModel;
using System.Collections.Generic;
using IntTourism.Com.Transvalue.Bean;
using IntTourism.Com.Transvalue.Tools;
using IntTourism.Com.Transvalue.Const;
using System.Threading.Tasks;
namespace IntTourism.ViewModel
{
/// <summary>
/// This class contains properties that the main View can data bind to.
/// <para>
/// See http://www.galasoft.ch/mvvm
/// </para>
/// </summary>
public class MainViewModel : ViewModelBase
{
private readonly IMainPageSerivce _dataService;
#region Command
private RelayCommand<ExCommandParameter> _menuCMD;
/// <summary>
/// Gets the MenuCMD.
/// </summary>
public RelayCommand<ExCommandParameter> MenuCMD
{
get
{
return _menuCMD ?? (_menuCMD =
new RelayCommand<ExCommandParameter>(
ExecuteMenuCMD,
CanExecuteMenuCMD));
}
}
private async
void ExecuteMenuCMD(ExCommandParameter url)
{
await Task.Run(() =>
{
var nav = new NavigateParameter();
nav.Parameter = url.Parameter;
nav.PageType = url.NavigateUrl;
if (null != url.NavigateUrl)
{
Messenger.Default.Send<bool>(true,
"ContentBusy");
Messenger.Default.Send<NavigateParameter>(nav, "MenuNavigate");
}
});
}
private bool CanExecuteMenuCMD(ExCommandParameter url)
{
if (null != url && !"".Equals(url))
return true;
else return
false;
}
#endregion
#region DataProperties
#region MenuItems
/// <summary>
/// The <see cref="MenuItems" /> property's name.
/// </summary>
public const
string MenuItemsPropertyName = "MenuItems";
private ObservableCollection<MenuItem> _menuItems;
/// <summary>
/// Sets and gets the MenuItems property.
/// Changes to that property's value raise the PropertyChanged event.
/// This property's value is broadcasted by the MessengerInstance when it changes.
/// </summary>
public ObservableCollection<MenuItem> MenuItems
{
get
{
return _menuItems;
}
set
{
if (_menuItems == value)
{
return;
}
RaisePropertyChanging(() => MenuItems);
var oldValue = _menuItems;
_menuItems = value;
RaisePropertyChanged(() => MenuItems, oldValue, value, true);
}
}
#endregion
/// <summary>
/// The <see cref="WelcomeTitle" /> property's name.
/// </summary>
public const
string WelcomeTitlePropertyName =
"WelcomeTitle";
private string _welcomeTitle;
/// <summary>
/// Sets and gets the WelcomeTitle property.
/// Changes to that property's value raise the PropertyChanged event.
/// This property's value is broadcasted by the MessengerInstance when it changes.
/// </summary>
public string WelcomeTitle
{
get
{
return _welcomeTitle;
}
set
{
if (_welcomeTitle == value)
{
return;
}
RaisePropertyChanging(WelcomeTitlePropertyName);
var oldValue = _welcomeTitle;
_welcomeTitle = value;
RaisePropertyChanged(WelcomeTitlePropertyName, oldValue, value,
true);
}
}
#endregion
/// <summary>
/// Initializes a new instance of the MainViewModel class.
/// </summary>
public MainViewModel(IMainPageSerivce dataService)
{
_dataService = dataService;
InitPropertyChanged();
_dataService.GetItemData(
async (items, error) =>
{
if (await Pollute.ReportError(error,
"GetItemData", ErrorDesc._E01))
{
Messenger.Default.Send<bool>(false,
"ContentBusy");
return;
}
var data = await items;
foreach (var item
in data)
item.MenuCMD = MenuCMD;
MenuItems = data;
Messenger.Default.Send<bool>(false,
"ContentBusy");
});
}
#region PropertyChangeMethods
/// <summary>
/// 初始化相关方法
/// </summary>
private void InitPropertyChanged()
{
PropertyChanging += PropertyChangingMethod;
PropertyChanged += PropertyChangedMethod;
}
//private static Dictionary<Predicate<string>, Action> PropertyChangingActions;
//private static Dictionary<Predicate<string>, Action> PropertyChangedActions;
private void PropertyChangedMethod(object sender, PropertyChangedEventArgs e)
{
}
private void PropertyChangingMethod(object sender, PropertyChangingEventArgs e)
{
}
#endregion
public override
void Cleanup()
{
// Clean up if needed
base.Cleanup();
}
}
}
菜单实例数据:
[csharp]
view plaincopyprint?
using System;
using System.Collections.ObjectModel;
using System.Threading.Tasks;
using IntTourism.Com.Transvalue.Bean;
using IntTourism.Com.Transvalue.Model;
using IntTourism.Com.Transvalue.Service;
namespace IntTourism.Com.Transvalue.Service.Impl
{
public class MainPageService : IMainPageSerivce
{
public void GetData(Action<DataItem, Exception> callback)
{
var item = new DataItem("Welcome to MVVM Light");
callback(item, null);
}
public void GetItemData(Action<Task<ObservableCollection<MenuItem>>, Exception> callback)
{
var result = Task.Run(() =>
{
var items = new ObservableCollection<MenuItem>();
var menu1 = new MenuItem();
menu1.IconUrl = "../Assets/ICON/交通.png";
menu1.NavigateUrl = "IntMaps";
items.Add(menu1);
var menu2 = new MenuItem();
menu2.IconUrl = "../Assets/ICON/娱乐.png";
menu2.NavigateUrl = "IntMaps";
menu2.NavigateParameter = "Play";
items.Add(menu2);
var menu3 = new MenuItem();
menu3.IconUrl = "../Assets/ICON/景点.png";
menu3.NavigateUrl = "SceneViewGroup";
items.Add(menu3);
var menu4 = new MenuItem();
menu4.IconUrl = "../Assets/ICON/购物.png";
menu4.NavigateUrl = "IntMaps";
menu4.NavigateParameter = "Buy";
items.Add(menu4);
var menu5 = new MenuItem();
menu5.IconUrl = "../Assets/ICON/专题旅游.png";
menu5.NavigateUrl = "SceneViewGroup";
menu5.NavigateParameter = "Travel";
items.Add(menu5);
var menu6 = new MenuItem();
menu6.IconUrl = "../Assets/ICON/实用信息.png";
items.Add(menu6);
var menu7 = new MenuItem();
menu7.IconUrl = "../Assets/ICON/武汉之最.png";
items.Add(menu7);
var menu8 = new MenuItem();
menu8.IconUrl = "../Assets/ICON/住宿.png";
menu8.NavigateUrl = "IntMaps";
menu8.NavigateParameter = "Rest";
items.Add(menu8);
var menu9 = new MenuItem();
menu9.IconUrl = "../Assets/ICON/推荐线路.png";
items.Add(menu9);
//var menu10 = new MenuItem();
//menu10.IconUrl = "../Assets/ICON/武汉介绍.png";
//items.Add(menu10);
var menu11 = new MenuItem();
menu11.IconUrl = "../Assets/ICON/周边旅游.png";
menu11.NavigateUrl = "IntMaps";
menu11.NavigateParameter = "AllTravel";
items.Add(menu11);
var menu12 = new MenuItem();
menu12.IconUrl = "../Assets/ICON/旅游动态.png";
items.Add(menu12);
var menu13 = new MenuItem();
menu13.IconUrl = "../Assets/ICON/美图欣赏.png";
items.Add(menu13);
var menu14 = new MenuItem();
menu14.IconUrl = "../Assets/ICON/天气预报.png";
items.Add(menu14);
var menu15 = new MenuItem();
menu15.IconUrl = "../Assets/ICON/旅游咨询.png";
items.Add(menu15);
var menu16 = new MenuItem();
menu16.IconUrl = "../Assets/ICON/美食.png";
menu16.NavigateUrl = "IntMaps";
menu16.NavigateParameter = "Eat";
items.Add(menu16);
return items;
});
callback(result, null);
}
}
}
以上sample 数据 可以存入数据库中 进行动态配置,完成菜单的动态显示,降低了程序的耦合,增加了可配置性。
该技术前提是 已经掌握一定程度的mvvmlight for win8 技巧
实现思路:
通过Messenger 机制 动态发送导航参数 到 需要导航的page 完成导航
导航参数:
[csharp]
view plaincopyprint?
public class NavigateParameter
{
private string pageType;
public string PageType
{
get { return pageType; }
set { pageType = value; }
}
private object parameter;
public object Parameter
{
get { return parameter; }
set { parameter = value; }
}
}
public class NavigateParameter { private string pageType; public string PageType { get { return pageType; } set { pageType = value; } } private object parameter; public object Parameter { get { return parameter; } set { parameter = value; } } }
在 OnNavigated 到首页的地方 加入以下方法 注册 该处理通道
[csharp]
view plaincopyprint?
protected override
void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
this.prContent.IsIndeterminate =
true;
this.ContentFrame.Navigate(typeof(MainPage));
this.TopFrame.Navigate(typeof(VideosPage));
#region Messengers 消息处理中心
Messenger.Default.Register<NavigateParameter>(this,
"MenuNavigate", async s =>
{
var type = await Task.Run<Type>(() =>
{
var fullName = "IntTourism.View." + s.PageType;
return Type.GetType(fullName);
});
if (null != s.Parameter)
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () =>
this.ContentFrame.Navigate(type, s.Parameter));
else
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () =>
this.ContentFrame.Navigate(type));
});
Messenger.Default.Register<NavigateParameter>(this,
"TopFrameNavigate", async s =>
{
var type = await Task.Run<Type>(() =>
{
var fullName = "IntTourism.View." + s.PageType;
return Type.GetType(fullName);
});
await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () =>
{
if (!TopFrame.CurrentSourcePageType.Equals(type))
if (null != s.Parameter)
this.TopFrame.Navigate(type, s.Parameter);
else
this.TopFrame.Navigate(type);
});
});
#endregion
}
protected override void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); this.prContent.IsIndeterminate = true; this.ContentFrame.Navigate(typeof(MainPage)); this.TopFrame.Navigate(typeof(VideosPage)); #region Messengers 消息处理中心 Messenger.Default.Register<NavigateParameter>(this, "MenuNavigate", async s => { var type = await Task.Run<Type>(() => { var fullName = "IntTourism.View." + s.PageType; return Type.GetType(fullName); }); if (null != s.Parameter) await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () => this.ContentFrame.Navigate(type, s.Parameter)); else await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () => this.ContentFrame.Navigate(type)); }); Messenger.Default.Register<NavigateParameter>(this, "TopFrameNavigate", async s => { var type = await Task.Run<Type>(() => { var fullName = "IntTourism.View." + s.PageType; return Type.GetType(fullName); }); await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () => { if (!TopFrame.CurrentSourcePageType.Equals(type)) if (null != s.Parameter) this.TopFrame.Navigate(type, s.Parameter); else this.TopFrame.Navigate(type); }); }); #endregion }
Unloaded 注销
[csharp]
view plaincopyprint?
private void LayoutAwarePage_Unloaded(object sender, RoutedEventArgs e)
{
Messenger.Default.Unregister<NavigateParameter>(this,
"MenuNavigate");
Messenger.Default.Unregister<LogBean>(this,
"LogError");
Messenger.Default.Unregister<LogBean>(this,
"TopBusy");
Messenger.Default.Unregister<LogBean>(this,
"ContentBusy");
Messenger.Default.Unregister<LogBean>(this,
"TopFrame");
this.btnCancel.PointerPressed -= SendError;
this.btnSend.PointerPressed -= SendError;
}
private void LayoutAwarePage_Unloaded(object sender, RoutedEventArgs e) { Messenger.Default.Unregister<NavigateParameter>(this, "MenuNavigate"); Messenger.Default.Unregister<LogBean>(this, "LogError"); Messenger.Default.Unregister<LogBean>(this, "TopBusy"); Messenger.Default.Unregister<LogBean>(this, "ContentBusy"); Messenger.Default.Unregister<LogBean>(this, "TopFrame"); this.btnCancel.PointerPressed -= SendError; this.btnSend.PointerPressed -= SendError; }
以下为xaml 里 gridview 菜单的binding方式
注意:ItemClick 此处通过eventTocommand 将事件与 viewmodel中相应的命令进行了binding处理 请结合我上一篇文章 对EventTocomand这一概念进行理解
[html]
view plaincopyprint?
<common:LayoutAwarePage
x:Class="IntTourism.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"
xmlns:i="using:IntTourism.Com.Transvalue.Tools"
xmlns:ignore="http://www.ignore.com"
xmlns:common="using:IntTourism.Common"
xmlns:cmd="using:IntTourism"
mc:Ignorable="d ignore"
d:DesignHeight="1080"
d:DesignWidth="1080"
DataContext="{Binding Main, Source={StaticResource Locator}}"
NavigationCacheMode="Required">
<Viewbox>
<Grid
Width="1080"
Height="1080"
x:Name="root">
<GridView
HorizontalAlignment="Left"
VerticalAlignment="Top"
Width="1080"
Height="1080"
CanDragItems="false"
IsRightTapEnabled="False"
ScrollViewer.HorizontalScrollBarVisibility="Hidden"
IsSwipeEnabled="False"
x:Name="gv"
ItemsSource="{Binding MenuItems}"
SelectionMode="None"
>
<GridView.Transitions>
<TransitionCollection>
<EntranceThemeTransition/>
</TransitionCollection>
</GridView.Transitions>
<GridView.ItemContainerTransitions>
<TransitionCollection>
<EntranceThemeTransition/>
</TransitionCollection>
</GridView.ItemContainerTransitions>
<GridView.HeaderTransitions>
<TransitionCollection>
<EntranceThemeTransition/>
</TransitionCollection>
</GridView.HeaderTransitions>
<GridView.ItemTemplate>
<DataTemplate>
<GridViewItem>
<Image
Height="280"
Width="280"
Source="{Binding IconUrl}"/>
<i:EventToCommandCollection.Items>
<i:EventToCommand
Command="{Binding MenuCMD}"
CommandParameter="{Binding NavigateParameter}"
NavigateUrl="{Binding NavigateUrl}"
Event="ItemClick"/>
</i:EventToCommandCollection.Items>
</GridViewItem>
</DataTemplate>
</GridView.ItemTemplate>
<GridView.ItemsPanel>
<ItemsPanelTemplate>
<VariableSizedWrapGrid
Orientation="Vertical"
Margin="0,0,80,0"
ItemWidth="300"
ItemHeight="300"
MaximumRowsOrColumns="10"/>
</ItemsPanelTemplate>
</GridView.ItemsPanel>
</GridView>
</Grid>
</Viewbox>
</common:LayoutAwarePage>
<common:LayoutAwarePage x:Class="IntTourism.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" xmlns:i="using:IntTourism.Com.Transvalue.Tools" xmlns:ignore="http://www.ignore.com" xmlns:common="using:IntTourism.Common" xmlns:cmd="using:IntTourism" mc:Ignorable="d ignore" d:DesignHeight="1080" d:DesignWidth="1080" DataContext="{Binding Main, Source={StaticResource Locator}}" NavigationCacheMode="Required"> <Viewbox> <Grid Width="1080" Height="1080" x:Name="root"> <GridView HorizontalAlignment="Left" VerticalAlignment="Top" Width="1080" Height="1080" CanDragItems="false" IsRightTapEnabled="False" ScrollViewer.HorizontalScrollBarVisibility="Hidden" IsSwipeEnabled="False" x:Name="gv" ItemsSource="{Binding MenuItems}" SelectionMode="None" > <GridView.Transitions> <TransitionCollection> <EntranceThemeTransition/> </TransitionCollection> </GridView.Transitions> <GridView.ItemContainerTransitions> <TransitionCollection> <EntranceThemeTransition/> </TransitionCollection> </GridView.ItemContainerTransitions> <GridView.HeaderTransitions> <TransitionCollection> <EntranceThemeTransition/> </TransitionCollection> </GridView.HeaderTransitions> <GridView.ItemTemplate> <DataTemplate> <GridViewItem> <Image Height="280" Width="280" Source="{Binding IconUrl}"/> <i:EventToCommandCollection.Items> <i:EventToCommand Command="{Binding MenuCMD}" CommandParameter="{Binding NavigateParameter}" NavigateUrl="{Binding NavigateUrl}" Event="ItemClick"/> </i:EventToCommandCollection.Items> </GridViewItem> </DataTemplate> </GridView.ItemTemplate> <GridView.ItemsPanel> <ItemsPanelTemplate> <VariableSizedWrapGrid Orientation="Vertical" Margin="0,0,80,0" ItemWidth="300" ItemHeight="300" MaximumRowsOrColumns="10"/> </ItemsPanelTemplate> </GridView.ItemsPanel> </GridView> </Grid> </Viewbox> </common:LayoutAwarePage>
下面这一段是ViewModel中对命令的处理,以及菜单的动态加载
[csharp]
view plaincopyprint?
using GalaSoft.MvvmLight;
using IntTourism.Com.Transvalue.Service;
using GalaSoft.MvvmLight.Command;
using System.Diagnostics;
using Windows.UI.Xaml.Controls;
using System.Collections;
using System.Collections.ObjectModel;
using IntTourism.Com.Transvalue.Model;
using GalaSoft.MvvmLight.Messaging;
using System;
using System.ComponentModel;
using System.Collections.Generic;
using IntTourism.Com.Transvalue.Bean;
using IntTourism.Com.Transvalue.Tools;
using IntTourism.Com.Transvalue.Const;
using System.Threading.Tasks;
namespace IntTourism.ViewModel
{
/// <summary>
/// This class contains properties that the main View can data bind to.
/// <para>
/// See http://www.galasoft.ch/mvvm
/// </para>
/// </summary>
public class MainViewModel : ViewModelBase
{
private readonly IMainPageSerivce _dataService;
#region Command
private RelayCommand<ExCommandParameter> _menuCMD;
/// <summary>
/// Gets the MenuCMD.
/// </summary>
public RelayCommand<ExCommandParameter> MenuCMD
{
get
{
return _menuCMD ?? (_menuCMD =
new RelayCommand<ExCommandParameter>(
ExecuteMenuCMD,
CanExecuteMenuCMD));
}
}
private async
void ExecuteMenuCMD(ExCommandParameter url)
{
await Task.Run(() =>
{
var nav = new NavigateParameter();
nav.Parameter = url.Parameter;
nav.PageType = url.NavigateUrl;
if (null != url.NavigateUrl)
{
Messenger.Default.Send<bool>(true,
"ContentBusy");
Messenger.Default.Send<NavigateParameter>(nav, "MenuNavigate");
}
});
}
private bool CanExecuteMenuCMD(ExCommandParameter url)
{
if (null != url && !"".Equals(url))
return true;
else return
false;
}
#endregion
#region DataProperties
#region MenuItems
/// <summary>
/// The <see cref="MenuItems" /> property's name.
/// </summary>
public const
string MenuItemsPropertyName = "MenuItems";
private ObservableCollection<MenuItem> _menuItems;
/// <summary>
/// Sets and gets the MenuItems property.
/// Changes to that property's value raise the PropertyChanged event.
/// This property's value is broadcasted by the MessengerInstance when it changes.
/// </summary>
public ObservableCollection<MenuItem> MenuItems
{
get
{
return _menuItems;
}
set
{
if (_menuItems == value)
{
return;
}
RaisePropertyChanging(() => MenuItems);
var oldValue = _menuItems;
_menuItems = value;
RaisePropertyChanged(() => MenuItems, oldValue, value, true);
}
}
#endregion
/// <summary>
/// The <see cref="WelcomeTitle" /> property's name.
/// </summary>
public const
string WelcomeTitlePropertyName =
"WelcomeTitle";
private string _welcomeTitle;
/// <summary>
/// Sets and gets the WelcomeTitle property.
/// Changes to that property's value raise the PropertyChanged event.
/// This property's value is broadcasted by the MessengerInstance when it changes.
/// </summary>
public string WelcomeTitle
{
get
{
return _welcomeTitle;
}
set
{
if (_welcomeTitle == value)
{
return;
}
RaisePropertyChanging(WelcomeTitlePropertyName);
var oldValue = _welcomeTitle;
_welcomeTitle = value;
RaisePropertyChanged(WelcomeTitlePropertyName, oldValue, value,
true);
}
}
#endregion
/// <summary>
/// Initializes a new instance of the MainViewModel class.
/// </summary>
public MainViewModel(IMainPageSerivce dataService)
{
_dataService = dataService;
InitPropertyChanged();
_dataService.GetItemData(
async (items, error) =>
{
if (await Pollute.ReportError(error,
"GetItemData", ErrorDesc._E01))
{
Messenger.Default.Send<bool>(false,
"ContentBusy");
return;
}
var data = await items;
foreach (var item
in data)
item.MenuCMD = MenuCMD;
MenuItems = data;
Messenger.Default.Send<bool>(false,
"ContentBusy");
});
}
#region PropertyChangeMethods
/// <summary>
/// 初始化相关方法
/// </summary>
private void InitPropertyChanged()
{
PropertyChanging += PropertyChangingMethod;
PropertyChanged += PropertyChangedMethod;
}
//private static Dictionary<Predicate<string>, Action> PropertyChangingActions;
//private static Dictionary<Predicate<string>, Action> PropertyChangedActions;
private void PropertyChangedMethod(object sender, PropertyChangedEventArgs e)
{
}
private void PropertyChangingMethod(object sender, PropertyChangingEventArgs e)
{
}
#endregion
public override
void Cleanup()
{
// Clean up if needed
base.Cleanup();
}
}
}
using GalaSoft.MvvmLight; using IntTourism.Com.Transvalue.Service; using GalaSoft.MvvmLight.Command; using System.Diagnostics; using Windows.UI.Xaml.Controls; using System.Collections; using System.Collections.ObjectModel; using IntTourism.Com.Transvalue.Model; using GalaSoft.MvvmLight.Messaging; using System; using System.ComponentModel; using System.Collections.Generic; using IntTourism.Com.Transvalue.Bean; using IntTourism.Com.Transvalue.Tools; using IntTourism.Com.Transvalue.Const; using System.Threading.Tasks; namespace IntTourism.ViewModel { /// <summary> /// This class contains properties that the main View can data bind to. /// <para> /// See http://www.galasoft.ch/mvvm /// </para> /// </summary> public class MainViewModel : ViewModelBase { private readonly IMainPageSerivce _dataService; #region Command private RelayCommand<ExCommandParameter> _menuCMD; /// <summary> /// Gets the MenuCMD. /// </summary> public RelayCommand<ExCommandParameter> MenuCMD { get { return _menuCMD ?? (_menuCMD = new RelayCommand<ExCommandParameter>( ExecuteMenuCMD, CanExecuteMenuCMD)); } } private async void ExecuteMenuCMD(ExCommandParameter url) { await Task.Run(() => { var nav = new NavigateParameter(); nav.Parameter = url.Parameter; nav.PageType = url.NavigateUrl; if (null != url.NavigateUrl) { Messenger.Default.Send<bool>(true, "ContentBusy"); Messenger.Default.Send<NavigateParameter>(nav, "MenuNavigate"); } }); } private bool CanExecuteMenuCMD(ExCommandParameter url) { if (null != url && !"".Equals(url)) return true; else return false; } #endregion #region DataProperties #region MenuItems /// <summary> /// The <see cref="MenuItems" /> property's name. /// </summary> public const string MenuItemsPropertyName = "MenuItems"; private ObservableCollection<MenuItem> _menuItems; /// <summary> /// Sets and gets the MenuItems property. /// Changes to that property's value raise the PropertyChanged event. /// This property's value is broadcasted by the MessengerInstance when it changes. /// </summary> public ObservableCollection<MenuItem> MenuItems { get { return _menuItems; } set { if (_menuItems == value) { return; } RaisePropertyChanging(() => MenuItems); var oldValue = _menuItems; _menuItems = value; RaisePropertyChanged(() => MenuItems, oldValue, value, true); } } #endregion /// <summary> /// The <see cref="WelcomeTitle" /> property's name. /// </summary> public const string WelcomeTitlePropertyName = "WelcomeTitle"; private string _welcomeTitle; /// <summary> /// Sets and gets the WelcomeTitle property. /// Changes to that property's value raise the PropertyChanged event. /// This property's value is broadcasted by the MessengerInstance when it changes. /// </summary> public string WelcomeTitle { get { return _welcomeTitle; } set { if (_welcomeTitle == value) { return; } RaisePropertyChanging(WelcomeTitlePropertyName); var oldValue = _welcomeTitle; _welcomeTitle = value; RaisePropertyChanged(WelcomeTitlePropertyName, oldValue, value, true); } } #endregion /// <summary> /// Initializes a new instance of the MainViewModel class. /// </summary> public MainViewModel(IMainPageSerivce dataService) { _dataService = dataService; InitPropertyChanged(); _dataService.GetItemData( async (items, error) => { if (await Pollute.ReportError(error, "GetItemData", ErrorDesc._E01)) { Messenger.Default.Send<bool>(false, "ContentBusy"); return; } var data = await items; foreach (var item in data) item.MenuCMD = MenuCMD; MenuItems = data; Messenger.Default.Send<bool>(false, "ContentBusy"); }); } #region PropertyChangeMethods /// <summary> /// 初始化相关方法 /// </summary> private void InitPropertyChanged() { PropertyChanging += PropertyChangingMethod; PropertyChanged += PropertyChangedMethod; } //private static Dictionary<Predicate<string>, Action> PropertyChangingActions; //private static Dictionary<Predicate<string>, Action> PropertyChangedActions; private void PropertyChangedMethod(object sender, PropertyChangedEventArgs e) { } private void PropertyChangingMethod(object sender, PropertyChangingEventArgs e) { } #endregion public override void Cleanup() { // Clean up if needed base.Cleanup(); } } }
菜单实例数据:
[csharp]
view plaincopyprint?
using System;
using System.Collections.ObjectModel;
using System.Threading.Tasks;
using IntTourism.Com.Transvalue.Bean;
using IntTourism.Com.Transvalue.Model;
using IntTourism.Com.Transvalue.Service;
namespace IntTourism.Com.Transvalue.Service.Impl
{
public class MainPageService : IMainPageSerivce
{
public void GetData(Action<DataItem, Exception> callback)
{
var item = new DataItem("Welcome to MVVM Light");
callback(item, null);
}
public void GetItemData(Action<Task<ObservableCollection<MenuItem>>, Exception> callback)
{
var result = Task.Run(() =>
{
var items = new ObservableCollection<MenuItem>();
var menu1 = new MenuItem();
menu1.IconUrl = "../Assets/ICON/交通.png";
menu1.NavigateUrl = "IntMaps";
items.Add(menu1);
var menu2 = new MenuItem();
menu2.IconUrl = "../Assets/ICON/娱乐.png";
menu2.NavigateUrl = "IntMaps";
menu2.NavigateParameter = "Play";
items.Add(menu2);
var menu3 = new MenuItem();
menu3.IconUrl = "../Assets/ICON/景点.png";
menu3.NavigateUrl = "SceneViewGroup";
items.Add(menu3);
var menu4 = new MenuItem();
menu4.IconUrl = "../Assets/ICON/购物.png";
menu4.NavigateUrl = "IntMaps";
menu4.NavigateParameter = "Buy";
items.Add(menu4);
var menu5 = new MenuItem();
menu5.IconUrl = "../Assets/ICON/专题旅游.png";
menu5.NavigateUrl = "SceneViewGroup";
menu5.NavigateParameter = "Travel";
items.Add(menu5);
var menu6 = new MenuItem();
menu6.IconUrl = "../Assets/ICON/实用信息.png";
items.Add(menu6);
var menu7 = new MenuItem();
menu7.IconUrl = "../Assets/ICON/武汉之最.png";
items.Add(menu7);
var menu8 = new MenuItem();
menu8.IconUrl = "../Assets/ICON/住宿.png";
menu8.NavigateUrl = "IntMaps";
menu8.NavigateParameter = "Rest";
items.Add(menu8);
var menu9 = new MenuItem();
menu9.IconUrl = "../Assets/ICON/推荐线路.png";
items.Add(menu9);
//var menu10 = new MenuItem();
//menu10.IconUrl = "../Assets/ICON/武汉介绍.png";
//items.Add(menu10);
var menu11 = new MenuItem();
menu11.IconUrl = "../Assets/ICON/周边旅游.png";
menu11.NavigateUrl = "IntMaps";
menu11.NavigateParameter = "AllTravel";
items.Add(menu11);
var menu12 = new MenuItem();
menu12.IconUrl = "../Assets/ICON/旅游动态.png";
items.Add(menu12);
var menu13 = new MenuItem();
menu13.IconUrl = "../Assets/ICON/美图欣赏.png";
items.Add(menu13);
var menu14 = new MenuItem();
menu14.IconUrl = "../Assets/ICON/天气预报.png";
items.Add(menu14);
var menu15 = new MenuItem();
menu15.IconUrl = "../Assets/ICON/旅游咨询.png";
items.Add(menu15);
var menu16 = new MenuItem();
menu16.IconUrl = "../Assets/ICON/美食.png";
menu16.NavigateUrl = "IntMaps";
menu16.NavigateParameter = "Eat";
items.Add(menu16);
return items;
});
callback(result, null);
}
}
}
using System; using System.Collections.ObjectModel; using System.Threading.Tasks; using IntTourism.Com.Transvalue.Bean; using IntTourism.Com.Transvalue.Model; using IntTourism.Com.Transvalue.Service; namespace IntTourism.Com.Transvalue.Service.Impl { public class MainPageService : IMainPageSerivce { public void GetData(Action<DataItem, Exception> callback) { var item = new DataItem("Welcome to MVVM Light"); callback(item, null); } public void GetItemData(Action<Task<ObservableCollection<MenuItem>>, Exception> callback) { var result = Task.Run(() => { var items = new ObservableCollection<MenuItem>(); var menu1 = new MenuItem(); menu1.IconUrl = "../Assets/ICON/交通.png"; menu1.NavigateUrl = "IntMaps"; items.Add(menu1); var menu2 = new MenuItem(); menu2.IconUrl = "../Assets/ICON/娱乐.png"; menu2.NavigateUrl = "IntMaps"; menu2.NavigateParameter = "Play"; items.Add(menu2); var menu3 = new MenuItem(); menu3.IconUrl = "../Assets/ICON/景点.png"; menu3.NavigateUrl = "SceneViewGroup"; items.Add(menu3); var menu4 = new MenuItem(); menu4.IconUrl = "../Assets/ICON/购物.png"; menu4.NavigateUrl = "IntMaps"; menu4.NavigateParameter = "Buy"; items.Add(menu4); var menu5 = new MenuItem(); menu5.IconUrl = "../Assets/ICON/专题旅游.png"; menu5.NavigateUrl = "SceneViewGroup"; menu5.NavigateParameter = "Travel"; items.Add(menu5); var menu6 = new MenuItem(); menu6.IconUrl = "../Assets/ICON/实用信息.png"; items.Add(menu6); var menu7 = new MenuItem(); menu7.IconUrl = "../Assets/ICON/武汉之最.png"; items.Add(menu7); var menu8 = new MenuItem(); menu8.IconUrl = "../Assets/ICON/住宿.png"; menu8.NavigateUrl = "IntMaps"; menu8.NavigateParameter = "Rest"; items.Add(menu8); var menu9 = new MenuItem(); menu9.IconUrl = "../Assets/ICON/推荐线路.png"; items.Add(menu9); //var menu10 = new MenuItem(); //menu10.IconUrl = "../Assets/ICON/武汉介绍.png"; //items.Add(menu10); var menu11 = new MenuItem(); menu11.IconUrl = "../Assets/ICON/周边旅游.png"; menu11.NavigateUrl = "IntMaps"; menu11.NavigateParameter = "AllTravel"; items.Add(menu11); var menu12 = new MenuItem(); menu12.IconUrl = "../Assets/ICON/旅游动态.png"; items.Add(menu12); var menu13 = new MenuItem(); menu13.IconUrl = "../Assets/ICON/美图欣赏.png"; items.Add(menu13); var menu14 = new MenuItem(); menu14.IconUrl = "../Assets/ICON/天气预报.png"; items.Add(menu14); var menu15 = new MenuItem(); menu15.IconUrl = "../Assets/ICON/旅游咨询.png"; items.Add(menu15); var menu16 = new MenuItem(); menu16.IconUrl = "../Assets/ICON/美食.png"; menu16.NavigateUrl = "IntMaps"; menu16.NavigateParameter = "Eat"; items.Add(menu16); return items; }); callback(result, null); } } }
以上sample 数据 可以存入数据库中 进行动态配置,完成菜单的动态显示,降低了程序的耦合,增加了可配置性。
相关文章推荐
- 使用mvvmlight for win8 让GridViewItem项 实现动态命令导航
- 使用zTree实现导航树、angular实现数据动态绑定功能
- 使用Ruby简单实现的tail命令,支持动态输出
- MATLAB动态图画法-使用For命令实现重力加速度分叉
- GridView实现鼠标移动是,动态显示‘编辑、删除、查看’等命令按钮
- JQuery条件下使用 JS方式实现百度地图加载数据库中的坐标并实现动态刷新
- 使用Spring特性实现接口多实现类的动态调用
- 使用PHP调用系统命令实现ffmpeg的调用
- Aop之使用Castle动态代理实现对方法的拦截
- 使用C++类模板实现动态数组
- Android_Loader_使用LoaderManager管理Loader实现异步动态加载数据
- 使用 JAVA 中的动态代理实现数据库连接池
- MySQL中使用load data命令实现数据导入的方法
- 使用@PathVariable注解实现动态传值
- 使用CXF实现WebService,并在客户端实现动态调用
- android使用lua脚本实现动态逻辑
- C#中使用BindingList 绑定DataGridView 可以实现动态绑定,优与List<T>集合的绑定
- C#使用Panel实现窗体动态侧边栏
- Spring_AOP_Annotation使用Aspect实现动态代理
- vi 中如何使用 :s 命令实现字串的替换.