我尝试创建的屏幕是一个多部分结果查看器。批处理作业完成后,您可以双击它并打开此屏幕,其中包含有关刚刚运行的批处理作业(屏幕的前30%,全宽)的基本数据的顶部,然后是较低的70%将由左对齐列表框(宽度的20%)和一系列子结果组成,细节窗格占据剩余的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项目?
答案 0 :(得分:12)
使用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
的{{1}}类型的属性添加到父视图模型中:
ViewModel
现在,要在应用程序中显示不同的private IResultPanel viewModel = new FirstViewModel();
public IResultPanel ViewModel
{
get { return viewModel; }
set { if (viewModel != value) { viewModel = value; NotifyPropertyChanged("ViewModel"); } }
}
,只需将此属性设置为其他值:
Panel