質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

1099閲覧

Prismで同一Moduleを画面に描画し値の変更を取得したい

a-fujimura

総合スコア1

.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1グッド

1クリップ

投稿2021/07/07 06:03

前提・実現したいこと

年月日を入力するModuleをRegionで一つの画面に二つ表示したときにそれぞれ別のインスタンスを注入したい

発生している問題・エラーメッセージ

Gridで表示している
prism:RegionManager.RegionName="DateTime"と
prism:RegionManager.RegionName="DateTime2"に
それぞれ別のインスタンスを渡したいのだが
InfoViewModelで注入された二つの引数が同一のものになっているため
別々の表示をすることができない

DataTimeとDataTime2でそれぞれ別のRegionとして登録しているためそこからアクセスする方法、または何とか別のインスタンスを注入する方法はないか

<ContentControl Grid.Column = "1" Grid.Row = "4" prism:RegionManager.RegionName="DateTime" Margin="5,0,5,0" VerticalAlignment="Top"/> <TextBox Grid.Column = "1" Grid.Row = "5" Margin="5,0,5,0"/> <TextBlock Grid.Column = "2" Grid.Row = "0" Text=""/> <TextBox Grid.Column = "3" Grid.Row = "0" Margin="5,0,5,0"/> <ContentControl Grid.Column = "3" Grid.Row = "4" prism:RegionManager.RegionName="DateTime2" Margin="5,0,5,0" VerticalAlignment="Top"/>

該当のソースコード

Info.xmal

1 <Grid> 2 <Grid.ColumnDefinitions> 3 <ColumnDefinition Width="Auto"/> 4 <ColumnDefinition Width="1*"/> 5 <ColumnDefinition Width="Auto"/> 6 <ColumnDefinition Width="1*"/> 7 </Grid.ColumnDefinitions> 8 <Grid.RowDefinitions> 9 <RowDefinition Height="1*"/> 10 <RowDefinition Height="1*"/> 11 <RowDefinition Height="1*"/> 12 <RowDefinition Height="1*"/> 13 <RowDefinition Height="1*"/> 14 <RowDefinition Height="1*"/> 15 </Grid.RowDefinitions> 16 <TextBlock Grid.Column = "0" Grid.Row = "0" Text=""/> 17 <TextBlock Grid.Column = "0" Grid.Row = "1" Text=""/> 18 <TextBlock Grid.Column = "0" Grid.Row = "2" Text=""/> 19 <TextBlock Grid.Column = "0" Grid.Row = "3" Text=""/> 20 <TextBlock Grid.Column = "0" Grid.Row = "4" Text=""/> 21 <TextBlock Grid.Column = "0" Grid.Row = "5" Text=""/> 22 <TextBox Grid.Column = "1" Grid.Row = "0" Margin="5,0,5,0"/> 23 <TextBox Grid.Column = "1" Grid.Row = "1" Margin="5,0,5,0"/> 24 <TextBox Grid.Column = "1" Grid.Row = "2" Margin="5,0,5,0"/> 25 <TextBox Grid.Column = "1" Grid.Row = "3" Margin="5,0,5,0"/> 26 <ContentControl Grid.Column = "1" Grid.Row = "4" prism:RegionManager.RegionName="DateTime" Margin="5,0,5,0" VerticalAlignment="Top"/> 27 <TextBox Grid.Column = "1" Grid.Row = "5" Margin="5,0,5,0"/> 28 <TextBlock Grid.Column = "2" Grid.Row = "0" Text=""/> 29 <TextBox Grid.Column = "3" Grid.Row = "0" Margin="5,0,5,0"/> 30 <ContentControl Grid.Column = "3" Grid.Row = "4" prism:RegionManager.RegionName="DateTime2" Margin="5,0,5,0" VerticalAlignment="Top"/> 31 32 </Grid>
public class InfoViewModel : BindableBase { IDateTime DateTime;     IDateTime DateTime2; public DrInfoViewModel(IDateTime dataTime, IDateTime dataTime2) { DateTime = dataTime; DateTime2 = dataTime2; // dataTimeもdataTime2が共有されたインスタンスになっている } }
public class InfoModule : IModule { public void OnInitialized(IContainerProvider containerProvider) { var regionMan = containerProvider.Resolve<IRegionManager>(); regionMan.RegisterViewWithRegion("DrInfo", typeof(Views.DrInfoView)); } public void RegisterTypes(IContainerRegistry containerRegistry) { containerRegistry.RegisterInstance<IDateTime>(new DateTimeModel()); } }
public class DateTimeViewModel : BindableBase { IDateTime DateTime; public int YearValue { get; set; } public int MonthValue { get; set; } public int DayValue { get; set; } public List<int> Years { get; set; } = new List<int>(); public List<int> Months { get; set; } = new List<int>(); public List<int> Days { get; set; } = new List<int>(); public DateTimeViewModel(IDateTime dateTime) { DateTime = dateTime; for (var i = System.DateTime.Now.Year - 20; i <= System.DateTime.Now.Year; i++) { Years.Add(i); } Years = Years.OrderByDescending(x => x).ToList(); YearValue = dateTime.Years; for (var i = 1; i <= 12; i++) { Months.Add(i); } MonthValue = dateTime.Months; for (var i = 1; i <= 31; i++) { Days.Add(i); } DayValue = dateTime.Days; } } public interface IDateTime { public int Years { get; set; } public int Months { get; set; } public int Days { get; set; } } public class DateTimeModel : IDateTime { public int Years { get; set; } = System.DateTime.Now.Year; public int Months { get; set; } = System.DateTime.Now.Month; public int Days { get; set; } = System.DateTime.Now.Day; }
  public class DateTimeModule : IModule { public void OnInitialized(IContainerProvider containerProvider) { var regionMan = containerProvider.Resolve<IRegionManager>(); regionMan.RegisterViewWithRegion("DateTime", typeof(Views.DateTimeView)); regionMan.RegisterViewWithRegion("DateTime2", typeof(Views.DateTimeView)); } public void RegisterTypes(IContainerRegistry containerRegistry) { } }

試したこと

補足情報(FW/ツールのバージョンなど)

Prism.Unity 7.2
Prism.Wpf 7.2

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2021/07/07 09:24

(再現するのが面倒で)確認していないのでこちらに書きますが、 > containerRegistry.RegisterInstance<IDateTime>(new DateTimeModel()); RegisterInstanceしてるからじゃないですか? Registerにすれば毎回作るんじゃないでしょうか。 [Registering Types with Prism | Prism](https://prismlibrary.com/docs/dependency-injection/registering-types.html
guest

回答1

0

ベストアンサー

cs

1//containerRegistry.RegisterInstance<IDateTime>(new DateTimeModel()); 2containerRegistry.Register<IDateTime, DateTimeModel>();

Registerでいいことを確認しました。


Prism Full Appベースで記載のないものはデフォルト。

DrInfoViewInfoViewどっちなの?)等不明な部分はオミット。
DateTimeModel等で確認に不要な部分もばっさりカット。

Questions348165

xml:Views.MainWindow.xaml

1<Window 2 x:Class="Questions348165.Views.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:prism="http://prismlibrary.com/" 6 Width="525" 7 Height="350" 8 prism:ViewModelLocator.AutoWireViewModel="True"> 9 <StackPanel Orientation="Horizontal"> 10 <ContentControl prism:RegionManager.RegionName="DateTime" /> 11 <ContentControl prism:RegionManager.RegionName="DateTime2" /> 12 </StackPanel> 13</Window>

cs:App.xaml.cs

1using Prism.Ioc; 2using Prism.Modularity; 3using Questions348165.Modules.ModuleName; 4using Questions348165.Views; 5using System.Windows; 6 7namespace Questions348165 8{ 9 public partial class App 10 { 11 protected override Window CreateShell() => Container.Resolve<MainWindow>(); 12 13 protected override void RegisterTypes(IContainerRegistry containerRegistry) { } 14 15 protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog) 16 => moduleCatalog.AddModule<DateTimeModule>(); 17 } 18}

Questions348165.Modules.ModuleName

xml:Views.DateTimeView.xaml

1<UserControl 2 x:Class="Questions348165.Modules.ModuleName.Views.DateTimeView" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:prism="http://prismlibrary.com/" 6 prism:ViewModelLocator.AutoWireViewModel="True"> 7 <StackPanel> 8 <TextBlock Text="No" /> 9 <TextBlock Text="{Binding No}" /> 10 </StackPanel> 11</UserControl>

cs:DateTimeModule.cs

1using Prism.Ioc; 2using Prism.Modularity; 3using Prism.Regions; 4 5namespace Questions348165.Modules.ModuleName 6{ 7 public class DateTimeModule : IModule 8 { 9 public void OnInitialized(IContainerProvider containerProvider) 10 { 11 var regionMan = containerProvider.Resolve<IRegionManager>(); 12 regionMan.RegisterViewWithRegion("DateTime", typeof(Views.DateTimeView)); 13 regionMan.RegisterViewWithRegion("DateTime2", typeof(Views.DateTimeView)); 14 } 15 16 public void RegisterTypes(IContainerRegistry containerRegistry) 17 { 18 //containerRegistry.RegisterInstance<IDateTime>(new DateTimeModel()); 19 containerRegistry.Register<IDateTime, DateTimeModel>(); 20 } 21 } 22 23 public interface IDateTime 24 { 25 public int No { get; } 26 } 27 28 public class DateTimeModel : IDateTime 29 { 30 public int No { get; } 31 private static int no; 32 33 public DateTimeModel() => No = ++no; 34 } 35}

cs:ViewModels.DateTimeViewModel.cs

1using Prism.Mvvm; 2 3namespace Questions348165.Modules.ModuleName.ViewModels 4{ 5 public class DateTimeViewModel : BindableBase 6 { 7 IDateTime DateTime; 8 public int No => DateTime.No; 9 10 public DateTimeViewModel(IDateTime dateTime) 11 { 12 DateTime = dateTime; 13 } 14 } 15}

投稿2021/07/09 14:57

編集2023/07/28 13:42
TN8001

総合スコア9326

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

a-fujimura

2021/07/14 06:33

元のソースコードが膨大だったため切り取りで一貫性がなかったところもある中動作確認までしていただきありがとうございました 修正依頼でRegionでよいコメントをもらってからいろいろ試してしていましたがうまく動作確認できなかったので助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問