none
Prism.WpfのUserControl動的配置について RRS feed

  • 質問

  • View内にUserControlを動的に追加するソフトを作成しております。

    以下のURLの内容を参考に、サンプルを作ってみましたが、Prismのバージョンが違うせいなのか表示されず理由がわからずにいます。

    http://keenag.hatenablog.com/entry/2017/10/08/183208

    分かる方がいらっしゃいましたら、ご教授いただければ幸いです。

    [環境]

    .NET Framework 4.6.1

    Prism.Unity v7.2.0.1367

    MahApps.Metro v1.6.5

    ReactiveProperty v6.1.4

    App.xaml

    <prism:PrismApplication
        x:Class="Prism.Sample.App"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Prism.Sample"
        xmlns:prism="http://prismlibrary.com/">
        <Application.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
    
                    <!--  MahApps.Metro resource dictionaries. Make sure that all file names are Case Sensitive!  -->
                    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
                    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
                    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" />
    
                    <!--  Accent and AppTheme setting  -->
                    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" />
                    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" />
    
                </ResourceDictionary.MergedDictionaries>
    
            </ResourceDictionary>
        </Application.Resources>
    </prism:PrismApplication>
    
        public partial class App
        {
            protected override Window CreateShell()
            {
                return Container.Resolve<MainWindow>();
            }
    
            protected override void RegisterTypes(IContainerRegistry containerRegistry)
            {
                containerRegistry.Register<PrismUserControl1ViewModel>();
                containerRegistry.Register<PrismUserControl2>();
    
                containerRegistry.RegisterForNavigation<PrismUserControl1>();
                containerRegistry.RegisterForNavigation<PrismUserControl2>();
            }
        }
    


    MainWindow.xaml

    <mahctrl:MetroWindow
        x:Class="Prism.Sample.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mahctrl="http://metro.mahapps.com/winfx/xaml/controls"
        xmlns:prism="http://prismlibrary.com/"
        xmlns:v="clr-namespace:Prism.Sample.Views"
        xmlns:vm="clr-namespace:Prism.Sample.ViewModels"
        Title="{Binding Title}"
        Width="525"
        Height="350"
        prism:ViewModelLocator.AutoWireViewModel="True">
        <Window.Resources>
            <DataTemplate DataType="{x:Type vm:PrismUserControl1ViewModel}">
                <v:PrismUserControl1 />
            </DataTemplate>
            <DataTemplate DataType="{x:Type vm:PrismUserControl2ViewModel}">
                <v:PrismUserControl2 />
            </DataTemplate>
        </Window.Resources>
        <Grid>
            <ScrollViewer VerticalScrollBarVisibility="Auto">
                <ItemsControl ItemsSource="{Binding DisplayControlViewModels}" />
            </ScrollViewer>
        </Grid>
    </mahctrl:MetroWindow>
    

    MainWindowViewModel.cs

    using Prism.Mvvm;
    using Reactive.Bindings;
    
    namespace Prism.Sample.ViewModels
    {
        public class MainWindowViewModel : BindableBase
        {
            private string _title = "Prism Application";
            public string Title
            {
                get { return _title; }
                set { SetProperty(ref _title, value); }
            }
    
            public ReactiveCollection<DisplayControlViewModel> DisplayControlViewModels =>
                new ReactiveCollection<DisplayControlViewModel>();
    
            public MainWindowViewModel()
            {
                DisplayControlViewModels.Add(new PrismUserControl1ViewModel());
                DisplayControlViewModels.Add(new PrismUserControl2ViewModel());
            }
        }
    }
    

    PrismUserControl1.xaml

    <UserControl
        x:Class="Prism.Sample.Views.PrismUserControl1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://prismlibrary.com/"
        Width="100"
        Height="100"
        prism:ViewModelLocator.AutoWireViewModel="True">
        <Grid>
            <ComboBox
                Width="100"
                HorizontalAlignment="Left"
                VerticalAlignment="Top" />
        </Grid>
    </UserControl>
    

    2019年12月13日 7:01

回答

  • もう見ていないと思いますが、後から検索で訪問された方向けに調査結果を残しておきます。
    先に記載させていただいた Bootstrapper 指摘ですが誤指摘でした。無くても代わりに PrismApplication 継承でもできるんですね。ごめんなさい。


    で、調べた結果、原因は、ViewModels/MainWindowViewModel.cs の書き方にあるみたいです。私の環境だと、ラムダ演算子?(=>)でのゲッタープロパティだと記載の現象再現によりダメで、旧型式でのゲッタープロパティだとうまく表示されるみたいです。

    表示されない書き方

    public class MainWindowViewModel : BindableBase
    {
        ~
        public ReactiveCollection<DisplayControlViewModel> DisplayControlViewModels => ★←これ
            new ReactiveCollection<DisplayControlViewModel>();
        ~
    }


    表示される書き方

    public class MainWindowViewModel : BindableBase
    {
        ~
        public ReactiveCollection<DisplayControlViewModel> DisplayControlViewModels { get; } = ★←これ
            new ReactiveCollection<DisplayControlViewModel>();
        ~
    }




    そんな馬鹿な!?という調査結果なので、自分でも怪しいままですが、実際、表示されない/表示されるの切り替えが上記という動作結果でしたので、ご参考までにです。(私の環境が環境不正だと良いなとすら思います)

    以下はソースです。長いですが、一応全部載せておきます。
    .NET Framework 4.6.1 ではなく .NET Framework 4.7.2 にしてしまいましたが、現象再現していますので問題ないかと思います。


    ■環境
    Windows 10(Pro, x64, 1903)
    Visual Studio Community 2017(Version 15.9.11, 古いまま・・・)
    C#/WPF プロジェクト

    .NET Framework   4.7.2(より上位)
    Prism.Unity      v7.2.0.1422(より上位)
    MahApps.Metro    v1.6.5
    ReactiveProperty v6.1.4

    ■プロジェクト構成
    Prism.Sampleプロジェクト
      + ViewModels
          + DisplayControlViewModel.cs
          + MainWindowViewModel.cs
          + PrismUserControl1ViewModel.cs
          + PrismUserControl2ViewModel.cs
      + Views
          + MainWindow.xaml(and .cs)
          + PrismUserControl1.xaml(and .cs)
          + PrismUserControl2.xaml(and .cs)
      + App.xaml(and .cs)


    ViewModels レイヤー

    DisplayControlViewModel.cs (基底クラス)

    namespace Prism.Sample.ViewModels
    {
        public abstract class DisplayControlViewModel
        {
        }
    }


    PrismUserControl1ViewModel.cs

    using Reactive.Bindings;
    
    namespace Prism.Sample.ViewModels
    {
        public class PrismUserControl1ViewModel : DisplayControlViewModel
        {
            public ReactiveCollection<string> Items { get; private set; }
    
            public PrismUserControl1ViewModel()
            {
                Items = new ReactiveCollection<string>() { "Apple", "Banana", "Peach" };
            }
        }
    }


    PrismUserControl2ViewModel.cs

    using Reactive.Bindings;
    
    namespace Prism.Sample.ViewModels
    {
        public class PrismUserControl2ViewModel : DisplayControlViewModel
        {
            public ReactiveCollection<string> Items { get; private set; }
    
            public PrismUserControl2ViewModel()
            {
                Items = new ReactiveCollection<string>() { "item1", "item2", "item3" };
            }
        }
    }
    


    MainWindowViewModel.cs

    using Prism.Mvvm;
    using Reactive.Bindings;
    
    namespace Prism.Sample.ViewModels
    {
        public class MainWindowViewModel : BindableBase
        {
            private string _title = "Prism Application";
            public string Title
            {
                get { return _title; }
                set { SetProperty(ref _title, value); }
            }
    
            public ReactiveCollection<DisplayControlViewModel> DisplayControlViewModels { get; } =
                new ReactiveCollection<DisplayControlViewModel>();
    
            public MainWindowViewModel()
            {
                DisplayControlViewModels.Add(new PrismUserControl1ViewModel());
                DisplayControlViewModels.Add(new PrismUserControl2ViewModel());
                DisplayControlViewModels.Add(new PrismUserControl1ViewModel());
            }
        }
    }
    


    Views レイヤー

    PrismUserControl1.xaml(PrismUserControl1.xaml.cs はデフォルトのままです)
    ComboBox に ItemsSource を設定しないと、選択欄コントロールは表示されたとしても選択項目が表示されないです。

    <UserControl x:Class="Prism.Sample.Views.PrismUserControl1"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 xmlns:local="clr-namespace:Prism.Sample.Views"
                 xmlns:prism="http://prismlibrary.com/"
                 Width="300"
                 Height="50"
                 prism:ViewModelLocator.AutoWireViewModel="True">
        <Grid>
            <StackPanel Orientation="Horizontal">
                <ComboBox
                    Width="300"
                    Height="50"
                    FontSize="12"
                    HorizontalAlignment="Center"
                    VerticalAlignment="Center"
                    ItemsSource="{Binding Items}"/>
            </StackPanel>
        </Grid>
    </UserControl>


    PrismUserControl2.xaml(PrismUserControl2.xaml.cs はデフォルトのままです)
    同様です。ComboBox に ItemsSource を設定しないと、選択欄コントロールは表示されたとしても選択項目が表示されないです。

    <UserControl x:Class="Prism.Sample.Views.PrismUserControl2"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 xmlns:local="clr-namespace:Prism.Sample.Views"
                 xmlns:prism="http://prismlibrary.com/"
                 Width="300"
                 Height="50"
                 prism:ViewModelLocator.AutoWireViewModel="True">
        <Grid>
            <StackPanel Orientation="Horizontal">
                <ComboBox
                    Width="300"
                    Height="50"
                    FontSize="12"
                    HorizontalAlignment="Center"
                    VerticalAlignment="Center"
                    ItemsSource="{Binding Items}"/>
            </StackPanel>
        </Grid>
    </UserControl>


    MainWindow.xaml(MainWindow.xaml.cs はデフォルトのままです)

    <mah:MetroWindow x:Class="Prism.Sample.Views.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
            xmlns:prism="http://prismlibrary.com/"
            xmlns:v="clr-namespace:Prism.Sample.Views"
            xmlns:vm="clr-namespace:Prism.Sample.ViewModels"
            mc:Ignorable="d"
            Title="{Binding Title}" 
            Height="450" 
            Width="800"
            Background="LightSlateGray"
            prism:ViewModelLocator.AutoWireViewModel="True">
    
        <Window.Resources>
            <DataTemplate DataType="{x:Type vm:PrismUserControl1ViewModel}">
                <v:PrismUserControl1 />
            </DataTemplate>
            <DataTemplate DataType="{x:Type vm:PrismUserControl2ViewModel}">
                <v:PrismUserControl2 />
            </DataTemplate>
        </Window.Resources>
        
        <Grid>
            <ScrollViewer VerticalScrollBarVisibility="Auto">
                <ItemsControl ItemsSource="{Binding DisplayControlViewModels}" />
            </ScrollViewer>
        </Grid>
        
    </mah:MetroWindow>


    App.xaml

    <prism:PrismApplication x:Class="Prism.Sample.App"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:local="clr-namespace:Prism.Sample"
                 xmlns:prism="http://prismlibrary.com/">
        <Application.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
    
                    <!--  MahApps.Metro resource dictionaries. Make sure that all file names are Case Sensitive!  -->
                    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
                    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
                    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" />
    
                    <!--  Accent and AppTheme setting  -->
                    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" />
                    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" />
    
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Application.Resources>
    </prism:PrismApplication>


    App.xaml.cs
    ViewModel の登録処理 Register() で、PrismUserControl2ViewModel ではなく PrismUserControl2 を登録してしまっていますので直します。

    using System.Windows;
    
    using Prism.Ioc;
    using Prism.Sample.Views;
    using Prism.Sample.ViewModels;
    
    namespace Prism.Sample
    {
        /// <summary>
        /// App.xaml の相互作用ロジック
        /// </summary>
        public partial class App
        {
            protected override Window CreateShell()
            {
                return Container.Resolve<MainWindow>();
            }
            
            protected override void RegisterTypes(IContainerRegistry containerRegistry)
            {
                containerRegistry.Register<PrismUserControl1ViewModel>();
                containerRegistry.Register<PrismUserControl2ViewModel>();
                
                containerRegistry.RegisterForNavigation<PrismUserControl1>();
                containerRegistry.RegisterForNavigation<PrismUserControl2>();
            }
        }
    }
    


    最後に

    > これはサードパーティのフレームワークです。Prismを確認し、英語となりますが、stack overflowで質問をすることをご検討ください。

    上記の通り、怪しい調査結果となりましたので、やはり、ご検討いただければと思います。


    2019年12月18日 16:08

すべての返信

  • 上記のブログの一番下に書いてある GitHub のリンク先に飛んで、ソース全体を参考に勉強されたほうがいいかもです。
    (Bootstrapper.cs とか特に)
    2019年12月15日 2:40
  • しん11111111さん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    Prism は、WPF、Windows 10 UWP、および Xamarin フォームで疎結合、保守可能、およびテスト可能なXAMLアプリケーションを構築するためのフレームワークです。
    これはサードパーティのフレームワークです。

    Prismを確認し、英語となりますが、stack overflowで質問をすることをご検討ください。

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2019年12月17日 6:20
    モデレータ
  • もう見ていないと思いますが、後から検索で訪問された方向けに調査結果を残しておきます。
    先に記載させていただいた Bootstrapper 指摘ですが誤指摘でした。無くても代わりに PrismApplication 継承でもできるんですね。ごめんなさい。


    で、調べた結果、原因は、ViewModels/MainWindowViewModel.cs の書き方にあるみたいです。私の環境だと、ラムダ演算子?(=>)でのゲッタープロパティだと記載の現象再現によりダメで、旧型式でのゲッタープロパティだとうまく表示されるみたいです。

    表示されない書き方

    public class MainWindowViewModel : BindableBase
    {
        ~
        public ReactiveCollection<DisplayControlViewModel> DisplayControlViewModels => ★←これ
            new ReactiveCollection<DisplayControlViewModel>();
        ~
    }


    表示される書き方

    public class MainWindowViewModel : BindableBase
    {
        ~
        public ReactiveCollection<DisplayControlViewModel> DisplayControlViewModels { get; } = ★←これ
            new ReactiveCollection<DisplayControlViewModel>();
        ~
    }




    そんな馬鹿な!?という調査結果なので、自分でも怪しいままですが、実際、表示されない/表示されるの切り替えが上記という動作結果でしたので、ご参考までにです。(私の環境が環境不正だと良いなとすら思います)

    以下はソースです。長いですが、一応全部載せておきます。
    .NET Framework 4.6.1 ではなく .NET Framework 4.7.2 にしてしまいましたが、現象再現していますので問題ないかと思います。


    ■環境
    Windows 10(Pro, x64, 1903)
    Visual Studio Community 2017(Version 15.9.11, 古いまま・・・)
    C#/WPF プロジェクト

    .NET Framework   4.7.2(より上位)
    Prism.Unity      v7.2.0.1422(より上位)
    MahApps.Metro    v1.6.5
    ReactiveProperty v6.1.4

    ■プロジェクト構成
    Prism.Sampleプロジェクト
      + ViewModels
          + DisplayControlViewModel.cs
          + MainWindowViewModel.cs
          + PrismUserControl1ViewModel.cs
          + PrismUserControl2ViewModel.cs
      + Views
          + MainWindow.xaml(and .cs)
          + PrismUserControl1.xaml(and .cs)
          + PrismUserControl2.xaml(and .cs)
      + App.xaml(and .cs)


    ViewModels レイヤー

    DisplayControlViewModel.cs (基底クラス)

    namespace Prism.Sample.ViewModels
    {
        public abstract class DisplayControlViewModel
        {
        }
    }


    PrismUserControl1ViewModel.cs

    using Reactive.Bindings;
    
    namespace Prism.Sample.ViewModels
    {
        public class PrismUserControl1ViewModel : DisplayControlViewModel
        {
            public ReactiveCollection<string> Items { get; private set; }
    
            public PrismUserControl1ViewModel()
            {
                Items = new ReactiveCollection<string>() { "Apple", "Banana", "Peach" };
            }
        }
    }


    PrismUserControl2ViewModel.cs

    using Reactive.Bindings;
    
    namespace Prism.Sample.ViewModels
    {
        public class PrismUserControl2ViewModel : DisplayControlViewModel
        {
            public ReactiveCollection<string> Items { get; private set; }
    
            public PrismUserControl2ViewModel()
            {
                Items = new ReactiveCollection<string>() { "item1", "item2", "item3" };
            }
        }
    }
    


    MainWindowViewModel.cs

    using Prism.Mvvm;
    using Reactive.Bindings;
    
    namespace Prism.Sample.ViewModels
    {
        public class MainWindowViewModel : BindableBase
        {
            private string _title = "Prism Application";
            public string Title
            {
                get { return _title; }
                set { SetProperty(ref _title, value); }
            }
    
            public ReactiveCollection<DisplayControlViewModel> DisplayControlViewModels { get; } =
                new ReactiveCollection<DisplayControlViewModel>();
    
            public MainWindowViewModel()
            {
                DisplayControlViewModels.Add(new PrismUserControl1ViewModel());
                DisplayControlViewModels.Add(new PrismUserControl2ViewModel());
                DisplayControlViewModels.Add(new PrismUserControl1ViewModel());
            }
        }
    }
    


    Views レイヤー

    PrismUserControl1.xaml(PrismUserControl1.xaml.cs はデフォルトのままです)
    ComboBox に ItemsSource を設定しないと、選択欄コントロールは表示されたとしても選択項目が表示されないです。

    <UserControl x:Class="Prism.Sample.Views.PrismUserControl1"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 xmlns:local="clr-namespace:Prism.Sample.Views"
                 xmlns:prism="http://prismlibrary.com/"
                 Width="300"
                 Height="50"
                 prism:ViewModelLocator.AutoWireViewModel="True">
        <Grid>
            <StackPanel Orientation="Horizontal">
                <ComboBox
                    Width="300"
                    Height="50"
                    FontSize="12"
                    HorizontalAlignment="Center"
                    VerticalAlignment="Center"
                    ItemsSource="{Binding Items}"/>
            </StackPanel>
        </Grid>
    </UserControl>


    PrismUserControl2.xaml(PrismUserControl2.xaml.cs はデフォルトのままです)
    同様です。ComboBox に ItemsSource を設定しないと、選択欄コントロールは表示されたとしても選択項目が表示されないです。

    <UserControl x:Class="Prism.Sample.Views.PrismUserControl2"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 xmlns:local="clr-namespace:Prism.Sample.Views"
                 xmlns:prism="http://prismlibrary.com/"
                 Width="300"
                 Height="50"
                 prism:ViewModelLocator.AutoWireViewModel="True">
        <Grid>
            <StackPanel Orientation="Horizontal">
                <ComboBox
                    Width="300"
                    Height="50"
                    FontSize="12"
                    HorizontalAlignment="Center"
                    VerticalAlignment="Center"
                    ItemsSource="{Binding Items}"/>
            </StackPanel>
        </Grid>
    </UserControl>


    MainWindow.xaml(MainWindow.xaml.cs はデフォルトのままです)

    <mah:MetroWindow x:Class="Prism.Sample.Views.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
            xmlns:prism="http://prismlibrary.com/"
            xmlns:v="clr-namespace:Prism.Sample.Views"
            xmlns:vm="clr-namespace:Prism.Sample.ViewModels"
            mc:Ignorable="d"
            Title="{Binding Title}" 
            Height="450" 
            Width="800"
            Background="LightSlateGray"
            prism:ViewModelLocator.AutoWireViewModel="True">
    
        <Window.Resources>
            <DataTemplate DataType="{x:Type vm:PrismUserControl1ViewModel}">
                <v:PrismUserControl1 />
            </DataTemplate>
            <DataTemplate DataType="{x:Type vm:PrismUserControl2ViewModel}">
                <v:PrismUserControl2 />
            </DataTemplate>
        </Window.Resources>
        
        <Grid>
            <ScrollViewer VerticalScrollBarVisibility="Auto">
                <ItemsControl ItemsSource="{Binding DisplayControlViewModels}" />
            </ScrollViewer>
        </Grid>
        
    </mah:MetroWindow>


    App.xaml

    <prism:PrismApplication x:Class="Prism.Sample.App"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:local="clr-namespace:Prism.Sample"
                 xmlns:prism="http://prismlibrary.com/">
        <Application.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
    
                    <!--  MahApps.Metro resource dictionaries. Make sure that all file names are Case Sensitive!  -->
                    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
                    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
                    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" />
    
                    <!--  Accent and AppTheme setting  -->
                    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" />
                    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" />
    
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Application.Resources>
    </prism:PrismApplication>


    App.xaml.cs
    ViewModel の登録処理 Register() で、PrismUserControl2ViewModel ではなく PrismUserControl2 を登録してしまっていますので直します。

    using System.Windows;
    
    using Prism.Ioc;
    using Prism.Sample.Views;
    using Prism.Sample.ViewModels;
    
    namespace Prism.Sample
    {
        /// <summary>
        /// App.xaml の相互作用ロジック
        /// </summary>
        public partial class App
        {
            protected override Window CreateShell()
            {
                return Container.Resolve<MainWindow>();
            }
            
            protected override void RegisterTypes(IContainerRegistry containerRegistry)
            {
                containerRegistry.Register<PrismUserControl1ViewModel>();
                containerRegistry.Register<PrismUserControl2ViewModel>();
                
                containerRegistry.RegisterForNavigation<PrismUserControl1>();
                containerRegistry.RegisterForNavigation<PrismUserControl2>();
            }
        }
    }
    


    最後に

    > これはサードパーティのフレームワークです。Prismを確認し、英語となりますが、stack overflowで質問をすることをご検討ください。

    上記の通り、怪しい調査結果となりましたので、やはり、ご検討いただければと思います。


    2019年12月18日 16:08
  • ありがとうございます!

    ラムダ式ですとReactivePropertyは正しく動かさそうですね。私のほうでも同様でした。

    表題の問題とは直接関係ない問題だったようでお手数おかけしました。

    2019年12月28日 1:55
  • ※特になければ、ご返信は不要です。
    この件ですが、調べたところ、ReactiveProperty が正しくないのではなく、他の型でも再現するみたいです。


    C# の => プロパティ
    http://var.blog.jp/archives/67192510.html

    > 正しくは、
    > private A a { get { return new A(); } }

    とあるように、内部的には同じインスタンスではなく、毎回インスタンス生成したものを返却しているみたいです。
    これが確認できるのが以下のサンプルです。
    using System;
    using System.Collections.Generic;
    
    namespace ConsoleApp27
    {
        class Program
        {
            public static List<int> Items => new List<int>();
    
            static void Main(string[] args)
            {
                Items.Add(1);
                Items.Add(2);
                Items.Add(3);
    
                if (Items.Count == 0)
                    Console.WriteLine("毎回インスタンス生成して返却しています");
    
                Console.ReadKey();
            }
        }
    }

    実行すると、"毎回インスタンス生成して返却しています" という文字列は「表示されます」。{ get; } の糖衣構文と思いきや、怖いですね。
    2019年12月28日 14:39