MenuViewModel с 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>

inserted into a mainView

 <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);
}

Чтобы все было в нужном месте, должен ли я иметь MenuViewModel в MainViewModel? если нет, то Catel - это View-First, а не ViewModel-First (это не проблема, просто знать это!)

При таком подходе лучшая привязка меню должна быть сделана в MenuViewModel, верно?

Я прикрепил общую команду, чтобы открыть выбранный вид из меню... мне было интересно, какой лучший подход в коде команды для отправки информации в shwllviewmodel/idockingservice...

Должен ли я использовать сообщение, основанное на сообщении, или я должен сохранить ссылку на нее shellviewmodel/idockingservice, а затем вызвать метод, определенный в.

Спасибо


person advapi    schedule 19.05.2015    source источник


Ответы (1)


  1. Используйте асинхронное ожидание в вашем методе инициализации:

protected override async Task Initialize.

  1. Используйте Catel.Fody, тогда вы сможете легко использовать простые свойства, которые автоматически преобразуются в свойства Catel в классах Catel.

  2. Нет, вам не нужна MenuViewModel в MainViewModel. MenuView / MenuViewModel может быть самодостаточным, поэтому он может работать самостоятельно и размещаться где угодно. Весь смысл Catel в том, чтобы люди не возились с ручным созданием модели представления, которое делают все. Вы можете просто поместить контекст данных в представление, и оно должно создать правильную виртуальную машину самостоятельно.

person Geert van Horrik    schedule 20.05.2015
comment
Я спрашивал о том, как открыть, так как мне придется открыть панель в элементе управления стыковкой, поэтому есть немного больше логики... поэтому мне нужно отправить эту информацию в ShellViewmodel/IDockingService - person advapi; 20.05.2015
comment
См. примеры оболочки Orchestra. Там все делают похожие вещи. Используйте CommandContainerBase и зарегистрируйте службу стыковки, как мы реализовали IUIVisualizerService. Затем вы можете вызвать IDockingService.Show‹MyViewModel›(); - person Geert van Horrik; 20.05.2015