Я пытаюсь взять лучшее от 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, а затем вызвать метод, определенный в.
Спасибо