如何在CM管理的窗口中重复使用和组成零件?我发现了有关使用两个UserControl绑定到同一ViewModel的帖子,但是如果我想在同一个窗口中组成多个视图和视图模型,则不会太多。(组成“主视图”的每个视图的视图模型)
我的问题的第一部分将是如何分解组件以供重复使用?如果我在窗口中有两个区域,一个是数据网格,另一个是带有标签和文本框的详细信息视图,这些区域应该位于单独的用户控件,自定义控件或窗口中吗?理想情况下,每个窗口都是独立的,因此可以将它们分开并在其他窗口中使用。
因此,如果将它们分开,我将得到2个视图模型和2个视图。现在假设我要创建3个窗口,一个窗口带有第一个视图,第二个窗口带有第二个视图,第三个窗口带有两个视图。如何使用CM为每个窗口创建窗口并将每个视图连接到其视图模型?从我看到的示例中,我可以看到一个窗口中的大部分视图和视图模型。
我想我以前做过类似您要求的事情。我一直在玩其中一款,TabControl
目的是为喜欢的游戏托管几种不同的工具。
主要工具是一个项目浏览器,类似于通常的文件浏览器类型的程序,并且类似于上述的Jon。我将解释一些可能与您感兴趣/相关的部分(我删除了一些不太清晰的命名)。
主ExplorerView
选项卡本质上与Jon所描述的完全相同(希望这是一个好兆头-表示我不疯狂= D)
<UserControl x:Class="ItemsBrowser.Views.ItemsTabView"
<!-- namespaces -->
>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="2*"/>
</Grid.ColumnDefinitions>
<ContentControl x:Name="ItemsExplorer" Grid.Column="0" Grid.Row="0" />
<GridSplitter HorizontalAlignment="Right" VerticalAlignment="Stretch"
ResizeBehavior="PreviousAndNext" Width="4" Grid.Column="1" Background="#FFAAAAAA" />
<ContentControl x:Name="PanelView" Grid.Column="2" Grid.Row="0" />
</Grid>
</UserControl>
关联ViewModel
包含另外两个ViewModels
,用于组成主浏览器视图:
public class ItemsTabViewModel : Conductor<IScreen>.Collection.AllActive
{
public ItemsViewModel ItemsExplorer { get; set; }
public ExplorerPanelViewModel PanelView { get; set; }
// Ctor etc.
}
该ItemsExplorer
承载TreeView
式的控制,允许用户浏览各种类别的Item
从游戏。它在应用程序的多个位置使用,并由几个不同的控件组成。
的ExplorerPanelView
是在右手侧上的面板,该变化以显示数的ViewModels
,基于什么类型的项目的用户正在观看。用户还可以选择Views
在中ViewModel
显示的内容之间进行切换ExplorerPanelView
。
的ExplorerPanelView
样子:
<UserControl x:Class="MIS_PTBrochure.Views.ExplorerPanelView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:cal="http://www.caliburnproject.org">
<Grid>
<ContentControl cal:View.Model="{Binding Path=ActiveItem}"
cal:View.Context="{Binding Path=ActiveItem.State}"
Content="Select a folder."/>
</Grid>
</UserControl>
和ExplorerPanelViewModel
后面:
public class ExplorerPanelViewModel : Conductor<IScreen>.Collection.OneActive,
IHandle<ItemSelectedEvent> // More events.
{
public ItemViewModel ItemInfo { get; set; }
public CategoryFolderViewModel CategoryFolderInfo { get; set; }
public ExplorerPanelViewModel()
{
// My helper to access the `Caliburn.Micro` EventAggregator.
EventAggregatorFactory.EventAggregator.Subscribe(this);
// Other code
}
public void Handle(ItemSelectedEvent message)
{
// Other code to check active status
ItemInfo = message.selected;
ActivateItem(ItemInfo);
}
protected override void OnDeactivate(bool close)
{
Debug.WriteLine("Deactivated " + this.ToString() + close.ToString());
if (close) { EventAggregatorFactory.EventAggregator.Unsubscribe(this); }
base.OnDeactivate(close);
}
// Other code
}
我尝试删除了许多不相关的代码。本质上,我再次托管多个ViewModels
作为属性(尽管您可以保存一个集合),并在ViewModel
我引发了适当的事件时激活相关属性ItemsExplorerViewModel
。我正在使用Caliburn.Micro
EventAggregator
处理多个之间的通信ViewModels
。
从理论上讲,您可以省去属性,而只需激活ViewModels
事件本身中的引用即可。
关于cal:View.Context
和cal:View.Model
-我正在使用所有用户来切换可用的不同可用View
状态(ViewModel
该面板中显示的每个状态都继承自ViewModel
具有State
属性的基类)。
在某些地方,我使用Views
和弹出一些不同的窗口ViewModels
。为此,我利用Caliburn.Micro
WindowManager
。官方文档中没有很多有关此内容的信息(最好是搜索Google和CM讨论),这确实可以做到。
如果您看一下Caliburn.Micro.IWindowManager
界面,将会看到一些可以从WindowManager
实例调用的便捷方法。
public interface IWindowManager
{
bool? ShowDialog(object rootModel, object context = null, IDictionary<string, object> settings = null);
void ShowPopup(object rootModel, object context = null, IDictionary<string, object> settings = null);
void ShowWindow(object rootModel, object context = null, IDictionary<string, object> settings = null);
}
因此,要弹出一个新的Window
与ViewModel
你所选择的,我所做的这些方针的东西:
// Some basic Window settings.
dynamic settings = new ExpandoObject();
settings.Title = "Test Window";
settings.WindowStartupLocation = WindowStartupLocation.Manual;
settings.SizeToContent = SizeToContent.Manual;
settings.Width = 450;
settings.Height = 300;
var TestViewModel new TestViewModel();
WindowManagerFactory.WindowManager.ShowWindow(this.classSearch, null, settings);
Caliburn.Micro
应该再次解决您Views
的问题ViewModels
。
希望那里某处有用。我通过几次设计迭代就得出了这种解决方案,因此这可能不是解决其中某些问题的最佳方法。如果有人有建设性的批评,请让我知道= D
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句