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

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

新規登録して質問してみよう
ただいま回答率
85.35%
MVVM

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

WPF

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

Q&A

解決済

1回答

1656閲覧

ViewModelからUserControlの追加

退会済みユーザー

退会済みユーザー

総合スコア0

MVVM

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

WPF

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

0グッド

0クリップ

投稿2021/08/03 07:08

前提・実現したいこと

ViewModelからViewのGridにUserControlを追加する方法を教えていただきたいです。

・やりたい事
ボタン操作などをきっかけに、作成したUserControl画面をGridに表示させたい

コードビハインドでは下記ソースのように作成したのですが、ViewModelからの手段が分かりません。

よろしくお願いします。

該当のソースコード

xmal

1<Grid> 2 <Grid.RowDefinitions> 3 <RowDefinition Height="Auto"/> 4 <RowDefinition Height="*"/> 5 </Grid.RowDefinitions> 6 7 <Button Grid.Column="0" 8 Margin="10"/> 9 <Grid x:Name="grid" Grid.Row="1"> 1011 </Grid> 12</Grid>
public void Btn_Click(object sender, EventArgs e) { grid.Children.Clear(); grid.Children.Add(new UserControl()); }

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

Livet v3.2.1

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

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

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

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

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

hihijiji

2021/08/03 08:47

MVVM の目的の一つが、ViewModelにてUserControlなどのViewの部品を扱わなくすることです。 コードビハインドにコードが少なくなるのはMVVMを適用したときの結果です。 ご提示のコードの範囲ではMVVMとしておかしなところはありません。
guest

回答1

0

ベストアンサー

GridにUserControlを追加する方法

Gridなのは何か理由がありますか?
Gridは単に追加していくと重なってしまいますし、MVVMでRowColumn指定するのは割と面倒です。

提示C#コードではClearしてAddと常に一個しか入らないわけですが、毎回newすることが重要なんでしょうか?

やりたいこと自体はわかりますが、もう少し具体的な例でないと何とも言えません。

とりあえずありえそうなものを3パターン作ってみました(前2つはViewModelは関係ないし追加もしていませんが^^;

xml

1<Window 2 x:Class="Questions352544.Views.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:behaviors="http://schemas.microsoft.com/xaml/behaviors" 6 xmlns:v="clr-namespace:Questions352544.Views" 7 xmlns:vm="clr-namespace:Questions352544.ViewModels" 8 Width="600" 9 Height="350"> 10 <Window.Resources> 11 <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" /> 12 </Window.Resources> 13 14 <Window.DataContext> 15 <vm:MainWindowViewModel /> 16 </Window.DataContext> 17 18 <Grid> 19 <Grid.ColumnDefinitions> 20 <ColumnDefinition /> 21 <ColumnDefinition /> 22 <ColumnDefinition /> 23 </Grid.ColumnDefinitions> 24 25 <GroupBox Header="一回限り出現"> 26 <DockPanel> 27 <Button Content="Show" DockPanel.Dock="Top"> 28 <behaviors:Interaction.Triggers> 29 <behaviors:EventTrigger EventName="Click"> 30 <behaviors:ChangePropertyAction 31 PropertyName="Visibility" 32 TargetName="userControl1" 33 Value="Visible" /> 34 </behaviors:EventTrigger> 35 </behaviors:Interaction.Triggers> 36 </Button> 37 <Grid> 38 <v:UserControl1 39 x:Name="userControl1" 40 DataContext="only one" 41 Visibility="Hidden" /> 42 </Grid> 43 </DockPanel> 44 </GroupBox> 45 46 <GroupBox Grid.Column="1" Header="出したり消したり"> 47 <DockPanel> 48 <ToggleButton 49 x:Name="toggleButton" 50 Content="Show&amp;Hide" 51 DockPanel.Dock="Top" /> 52 <Grid> 53 <v:UserControl1 DataContext="only one" Visibility="{Binding IsChecked, Converter={StaticResource BooleanToVisibilityConverter}, ElementName=toggleButton}" /> 54 </Grid> 55 </DockPanel> 56 </GroupBox> 57 58 <GroupBox Grid.Column="2" Header="どんどん追加"> 59 <DockPanel> 60 <Button 61 Command="{Binding AddCommand}" 62 Content="Add" 63 DockPanel.Dock="Top" /> 64 <ItemsControl ItemsSource="{Binding Items}"> 65 <ItemsControl.ItemTemplate> 66 <DataTemplate> 67 <v:UserControl1 /> 68 </DataTemplate> 69 </ItemsControl.ItemTemplate> 70 </ItemsControl> 71 </DockPanel> 72 </GroupBox> 73 </Grid> 74</Window>

xml

1<UserControl 2 x:Class="Questions352544.Views.UserControl1" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 5 <Grid> 6 <TextBlock Text="{Binding ., StringFormat=UserControl1 - {0}}" /> 7 </Grid> 8</UserControl>

cs

1using Livet; 2using Livet.Commands; 3using System.Collections.ObjectModel; 4 5namespace Questions352544.ViewModels 6{ 7 public class MainWindowViewModel : ViewModel 8 { 9 public ViewModelCommand AddCommand { get; } 10 public ObservableCollection<int> Items { get; } = new ObservableCollection<int>(); 11 12 private int count; 13 14 public MainWindowViewModel() 15 { 16 AddCommand = new ViewModelCommand(() => Items.Add(++count)); 17 } 18 } 19}

ObservableCollection<int>と、intになっている深い意味はありません。
ObservableCollection<UserControl1ViewModel>となることのほうが普通かもしれませんが、ケースバイケースです。

アプリ画像

投稿2021/08/03 09:08

編集2023/07/28 14:54
TN8001

総合スコア9862

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

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

退会済みユーザー

退会済みユーザー

2021/08/05 02:58

Gridである必要はありません。 実現したいことは、ツールバーにあるボタンによって、画面を切り替えて表示させることです。 出したり消えたりを参考に、各UserControl画面のVisibilityをBindingするようにして、ボタンが押されたときにきにVisibilityを切り替えるようにしました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問