如何根据用户的输入动态查看用户控件?

时间:2012-09-29 12:05:04

标签: c# wpf mvvm

我是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这个,更好的想法?

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

我通常使用ContentControlContentControl.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