我是MVVM / WPF的新手,过去两周我一直在研究网络示例,但我仍然无法找到如何处理以下内容:
我正在为公司的制造部门制作某种“缺陷插入软件”。 用户可以“创建新记录”,然后根据用户的选择显示不同的UserControls与不同的Question / RadioButtons / ComboBoxes。
我启发了关于Internationalized Wizard的精彩文章,但本例中的向导非常简单直接。
以下代码创建了我的第一个向导步骤:
void CreatePages()
{
var welcomePage = new WelcomePageViewModel();
var settings = new SettingsViewModel();
var cellScrap = new WizardChooseCellScrapGradeViewModel(this.CellScrap);
var manufacturer = new WizardChooseManufacturerViewModel(this.CellScrap);
var pages = new List<WizardPageViewModelBase>();
pages.Add(welcomePage);
pages.Add(settings);
pages.Add(cellScrap);
pages.Add(manufacturer);
_pages = new ReadOnlyCollection<WizardPageViewModelBase>(pages);
}
现在,当用户选择制造商A时,程序应该要求他填写usercontrol_1中的数据,如果他选择制造商B,则会显示usercontrol_2。
这样做的最佳做法是什么?我想我不能使用ReadOnlyCollection这个,更好的想法?
答案 0 :(得分:0)
您可以在以下链接中找到答案
答案 1 :(得分:0)
我通常使用ContentControl
,ContentControl.Template
设置为基于某个绑定值DataTrigger
所需的模板
<DataTemplate x:Key="ManufacturerAView" TargetType="{x:Type local:WizardPageViewModelBase}">
<TextBlock Text="I'm Manufacturer A" />
</DataTemplate>
<DataTemplate x:Key="ManufacturerBView" TargetType="{x:Type local:WizardPageViewModelBase}">
<TextBlock Text="I'm Manufacturer B" />
</DataTemplate>
<ContentControl Content="{Binding }">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding Manufacturer}" Value="A">
<Setter Property="ContentTemplate" Value="{StaticResource ManufacturerAView}" />
</DataTrigger>
<DataTrigger Binding="{Binding Manufacturer}" Value="B">
<Setter Property="ContentTemplate" Value="{StaticResource ManufacturerBView}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
这仅适用于ManufacturerViewModel
相同的情况,无论选择哪个制造商。
如果不同,我会在ChooseManufacturerViewModel
附加一个PropertyChange事件,只要ManufacturerViewModel
属性发生变化,就会向集合添加特定的SelectedManufacturer
。
manufacturer.PropertyChanged += ChooseManufacturer_PropertyChanged;
pages.Add(manufacturer);
....
void ChooseManufacturer_PropertyChanged(object src, PropertyChangedEventArgs e)
{
if (e.PropertyName == "SelectedManufacturer")
{
switch ((WizardChooseManufacturerViewModel)src).SelectedManufacturer)
{
// You'll want to check any existing ManufactorerViewModels
// and remove them as well if needed
case "A":
Pages.Add(new ManufacturerAViewModel);
break;
case "B":
Pages.Add(new ManufacturerBViewModel);
break;
}
}
}
要正确通知用户界面已添加新页面,您需要制作ObservableCollection<WizardPageViewModelBase>
类型的网页,而不是ReadOnlyCollection