GridにUserControlを追加する方法
Grid
なのは何か理由がありますか?
Grid
は単に追加していくと重なってしまいますし、MVVMでRow
・Column
指定するのは割と面倒です。
提示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&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>
となることのほうが普通かもしれませんが、ケースバイケースです。