点击导航栏某项,出现一个子导航栏,如图:
实现原理其实很简单,主导航栏的"Navigation System"对应的也是一个DetailView,只不过这个DetailView包含一个Action类型的属性,如果不为该属性设计PropertyEditor,那么该项是无法通过UI编辑的,所以,说白了,就是为Action属性设计一个PropertyEditor。下面讲述一下如何完成这一任务:
1. 首先,定义两个Business类,一个NavigationObject代表图中主显示区的对象,注意包含了一个SingleChoiceAction和子项的集合。
public class NavigationObject : BaseObject, INotifyPropertyChanged
{
private ItemsDisplayStyle defaultChildItemsDisplayStyle = ItemsDisplayStyle.List;
private NavigationStyle navigationStyle = NavigationStyle.NavBar;
private SingleChoiceAction action;
private bool isWebApplication;
private void action_Execute(object sender, SingleChoiceActionExecuteEventArgs e)
{
Console.WriteLine(string.Format("The '{0}' navigation item is selected", e.SelectedChoiceActionItem.Caption));
}
private void ProcessItem(NavigationItem item, ChoiceActionItemCollection choiceActionItemCollection, ModelNode parentModel)
{
object objectKey = Session.GetKeyValue(item);
IModelNavigationItem modelNavigaionItem = parentModel.AddNode<IModelNavigationItem>(objectKey.ToString());
FillNavigationItemModel(item, modelNavigaionItem);
ChoiceActionItem choiceActionItem = new ChoiceActionItem(modelNavigaionItem, item);
choiceActionItem.ImageName = item.ImageName;
choiceActionItemCollection.Add(choiceActionItem);
SortItems(item.Items);
foreach (NavigationItem childItem in item.Items)
{
ProcessItem(childItem, choiceActionItem.Items, (ModelNode)modelNavigaionItem);
}
}
private void FillNavigationItemModel(NavigationItem item, IModelNavigationItem modelNavigaionItem)
{
modelNavigaionItem.Caption = item.Name;
modelNavigaionItem.Index = item.Index;
if (item.ChildItemsDisplayStyle == DemoNavigationChildItemsDisplayStyle.Default)
{
modelNavigaionItem.ChildItemsDisplayStyle = item.NavigationObject.DefaultChildItemsDisplayStyle;
}
else
{
modelNavigaionItem.ChildItemsDisplayStyle = item.ChildItemsDisplayStyle == DemoNavigationChildItemsDisplayStyle.List ? ItemsDisplayStyle.List : ItemsDisplayStyle.LargeIcons;
}
modelNavigaionItem.ImageName = item.ImageName;
}
protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
protected override void OnLoaded()
{
base.OnLoaded();
BuildAction();
}
internal void BuildAction()
{
//B152525
Action.Items.Clear();
SortItems(NavigationItems);
ModelApplicationCreator creator = NavigationDemoWindowController.ModelCreatorInstance;
if (creator != null)
{
ModelNode modelNavigationItems = creator.CreateNode(Guid.NewGuid().ToString(), typeof(IModelNavigationItems));
foreach (NavigationItem item in NavigationItems)
{
if (item.Parent == null)
{