【问题标题】:MenuViewModel with Catel带有 Catel 的 MenuViewModel
【发布时间】: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 的引用,然后调用其中定义的方法。

谢谢

【问题讨论】:

    标签: c# wpf catel


    【解决方案1】:
    1. 在您的初始化方法中使用异步等待:

    protected override async Task Initialize.

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

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

    【讨论】:

    • 我在问如何打开,因为我必须在停靠控件中打开一个窗格,所以有更多的逻辑......所以我需要将这些信息发送到 ShellViewmodel / IDockingService
    • 查看 Orchestra shell 示例。他们都在那里做类似的事情。使用 CommandContainerBase 并像我们实现 IUIVisualizerService 一样注册对接服务。然后就可以调用 IDockingService.Show();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多