2

私はMVVM/WPFが初めてで、過去2週間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.TemplateDataTrigger

<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 イベントを にアタッチします。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 に答える