我尝试创建的屏幕是一个多部分的结果查看器。批处理作业完成后,您可以双击它并打开此屏幕,其中将包含有关刚刚运行的批处理作业的基本数据的顶部(屏幕顶部的30%,全角),然后是下部70%将由左对齐的列表框(宽度的20%)和一个Sub-Results(子结果)选项组成,而Detail窗格将占据其余80%的宽度。
我希望它的行为方式是当您在左侧列表框中选择“子结果”时,右侧窗格将填充子结果的详细信息。因为它将变得很复杂并且需要可伸缩,所以我想将每个子结果详细信息显示面板实现为UserControl。
父级ViewModel包含一个IDictionary<Enum.ResultType, IResultPanel>
-,该字典的键将填充列表框,当您选择一个选项时,它将从该字典中获取IResultPanel对象,该对象将是User Control,下面是一个示例片段
public partial class SimpleCalcInfoResult : UserControl, IResultPanel
{
private SimpleCalcInfoResultViewModel _viewModel;
public SimpleCalcInfoResult(SimpleCalcInfoResultViewModel viewModel)
{
InitializeComponent();
_viewModel = viewModel;
}
}
IResultPanel接口是一个空白的空接口,仅用于促进能够使用通用类型的Dictionary,因为我觉得UserControls的字典太宽泛了。
我遇到的问题是我不知道要在父控件中使用哪种XAML来具有可变的UserControl面板。显然你可以拥有
<local:MyControl> ... </local:MyControl>
作为硬编码的用户控件,但是我如何拥有XAML的一部分,让我可以根据选择的ListBox项来更改显示的用户控件?
使用WPF可以轻松实现。但是,在使用MVVM时,我们“操纵”数据而不是UI控件。考虑到这一点,请首先在本节中DataTemplate
为每个自定义控件声明一个:Panel
Application.Resources
<DataTemplate DataType="{x:Type ViewModels:SimpleCalcInfoResultViewModel}">
<Views:SimpleCalcInfoResult />
</DataTemplate>
...
<DataTemplate DataType="{x:Type ViewModels:MainViewModel}">
<Views:MainView />
</DataTemplate>
现在,您所要做的就是使用ContentControl
:在右下方显示相关的视图模型:
<ContentControl Content="{Binding ViewModel}" />
最后,将类型IResultPanel
为type的属性添加ViewModel
到父视图模型:
private IResultPanel viewModel = new FirstViewModel();
public IResultPanel ViewModel
{
get { return viewModel; }
set { if (viewModel != value) { viewModel = value; NotifyPropertyChanged("ViewModel"); } }
}
现在,您需要Panel
在应用程序中显示不同的所有内容,就是将此属性设置为其他值:
ViewModel = new SimpleCalcInfoResultViewModel();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句