2

我是 MVVM/WPF 的新手,过去两周我一直在研究 Web 示例,但我仍然不知道如何处理以下问题:

我正在为公司的制造部门开发某种“缺陷插入软件”。用户可以“创建新记录”,然后根据用户的选择显示具有不同问题/单选按钮/组合框的不同用户控件。

我受到有关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,有更好的主意吗?

4

2 回答 2

0

您可以在以下链接中找到答案

于 2012-09-29T12:17:23.940 回答
0

我通常将 aContentControl设置为基于某个绑定值ContentControl.Template的 a 所需的任何模板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无论选择哪个制造商,这仅在您的相同时才有效。

如果它不同,我会将一个 PropertyChange 事件附加到该事件,该事件将在属性更改时向集合ChooseManufacturerViewModel添加一个特定的事件。ManufacturerViewModelSelectedManufacturer

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;
        }
    }
}

为了正确通知 UI 已添加新页面,您需要使用类型的页面ObservableCollection<WizardPageViewModelBase>而不是ReadOnlyCollection

于 2012-10-01T19:28:00.407 回答