【发布时间】:2015-05-19 13:11:01
【问题描述】:
我想从 Catel 那里得到最好的东西,我正在使用服务模式重构我的旧代码等等......
我创建了一个名为 MenuView 的视图
<catel:UserControl x:Class="CatelDocking.Menu.Views.MenuView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:catel="http://catel.codeplex.com">
<telerik:RadMenu ItemsSource="{Binding Menus}"></telerik:RadMenu>
插入到主视图中
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30" ></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<view:MenuView ></view:MenuView>
</Grid>
及其各自的视图模型:
public class MenuViewModel : ViewModelBase
{
private readonly IMenuService menuService;
public MenuViewModel(IMenuService menuService)
{
Argument.IsNotNull(() => menuService);
this.menuService = menuService;
}
protected override System.Threading.Tasks.Task Initialize()
{
menuService.AddTopLevelMenu(new Models.MenuItemNode { Text = "Test" });
return base.Initialize();
}
}
公共类 MainWindowViewModel : ViewModelBase { 私有只读 MenuViewModel menuViewModel;
public MainWindowViewModel(MenuViewModel menuViewModel)
{
this.menuViewModel = menuViewModel;
}
public override string Title { get { return "CatelDocking.Menu"; } }
/// <summary>
/// The Menu view model.
/// </summary>
public MenuViewModel MenuViewModel
{
get { return GetValue<MenuViewModel>(MenuViewModelProperty); }
set { SetValue(MenuViewModelProperty, value); }
}
/// <summary>
/// Register the menuViewModel property so it is known in the class.
/// </summary>
public static readonly PropertyData MenuViewModelProperty = RegisterProperty("MenuViewModel", typeof(MenuViewModel), null);
}
IMenuService 定义为
public interface IMenuService
{
MainMenuNode GetMenuRoot();
void AddTopLevelMenu(MenuItemNode node);
void RegisterMenu(MenuItemNode node);
}
为了把东西放在正确的位置,我应该在 MainViewModel 中有一个 MenuViewModel 吗?如果不是这样的话,Catel 是 View-First 而不是 ViewModel-First(这没问题,只是要知道它!)
使用这种方法,最好的菜单绑定应该在 MenuViewModel 中完成,对吗?
我附加了一个常用命令来从菜单中打开所选视图...想知道在命令代码中将信息发送到 shwllviewmodel/idockingservice 的最佳方法是什么...
我应该使用基于消息还是让我保留对 she shellviewmodel / idockingservice 的引用,然后调用其中定义的方法。
谢谢
【问题讨论】: