带有 Catel 的 MenuViewModel

MenuViewModel with Catel

我正在尝试从 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();
    }
}

public class 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...[=15= 的最佳方法是什么]

我应该使用基于消息还是让我保留对她的 shellviewmodel / idockingservice 的引用然后调用中定义的方法。

谢谢

  1. 在初始化方法中使用异步等待:

protected override async Task Initialize.

  1. 使用Catel.Fody,那么您可以轻松使用简单的属性,这些属性会自动转换为 Catel 上的 Catel 属性 类

  2. 不,您不需要 MainViewModel 中的 MenuViewModel。 MenuView / MenuViewModel 可以是自提供的,因此它可以 运行 自己放置在任何地方。 Catel 的全部意义在于防止人们不得不搞乱每个人都在做的手动视图模型创建。您可以将数据上下文放在视图上,它应该自己创建正确的虚拟机。