前提・実現したいこと
Window(Prism)側からボタン押下で動的にUsercontrolを配置したり、配置したユーザコントロールのプロパティ値を更新したりしたいと考えています。
いろいろなネット上より上述ができそうなことはわかっておりますが、冗長なプログラミングになる気がして手間取っております。
参考にさせていただいたURLは以下になります。
https://qiita.com/tera1707/items/8d24b21a05ad84a1c92f
該当のソースコード
[WindowのXaml]
Xaml
1<Window x:Class="TEST.Views.TESTFlowRegist" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:prism="http://prismlibrary.com/" 5 xmlns:views="clr-namespace:TEST.Views" 6 Height="360" Width="500" 7 prism:ViewModelLocator.AutoWireViewModel="True"> 8 <Grid> 9 <Grid.ColumnDefinitions> 10 <ColumnDefinition Width="7*"/> 11 <ColumnDefinition Width="2*"/> 12 </Grid.ColumnDefinitions> 13 <Label Grid.Column="0" Content="承認フロー名:" Margin="0,0,300,295"/> 14 <TextBox Grid.Column="0" Margin="0,0,130,295" HorizontalAlignment="Right" Width="164" /> 15 <ItemsControl Grid.Column="0" ItemsSource="{Binding Items}" Margin="0,42,0,0.5"> 16 <ItemsControl.ItemsPanel> 17 <ItemsPanelTemplate> 18 <Canvas /> 19 </ItemsPanelTemplate> 20 </ItemsControl.ItemsPanel> 21 <ItemsControl.ItemTemplate> 22 <DataTemplate> 23 <views:ActionPanel No="{Binding DataContext.No, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}" /> 24 </DataTemplate> 25 </ItemsControl.ItemTemplate> 26 <ItemsControl.ItemContainerStyle> 27 <Style TargetType="ContentPresenter"> 28 <Setter Property="Canvas.Top" Value="{Binding Y}" /> 29 <Setter Property="Canvas.Left" Value="{Binding X}" /> 30 </Style> 31 </ItemsControl.ItemContainerStyle> 32 </ItemsControl> 33 <Button Content="追加" Command="{Binding AddCommand}" Grid.Column="1" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="90" Height="35"/> 34 <Button Content="削除" Command="{Binding DelCommand}" Grid.Column="1" HorizontalAlignment="Left" Margin="10,68,0,0" VerticalAlignment="Top" Width="90" Height="35"/> 35 <Button Content="Or" Command="{Binding DelCommand}" Grid.Column="1" HorizontalAlignment="Left" Margin="10,115,0,0" VerticalAlignment="Top" Width="90" Height="35"/> 36 <Button Content="And" Command="{Binding DelCommand}" Grid.Column="1" HorizontalAlignment="Left" Margin="10,165,0,0" VerticalAlignment="Top" Width="90" Height="35"/> 37 </Grid> 38</Window>
[UserControlのXaml]
Xaml
1<UserControl x:Class="TEST.Views.ActionPanel" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:prism="http://prismlibrary.com/" 5 Width="340" Height="60" 6 x:Name="panel" 7 prism:ViewModelLocator.AutoWireViewModel="True"> 8 <Grid > 9 <TextBlock Text="{Binding No, ElementName=panel}" Margin="2,2,313,35" FontSize="14"/> 10 <!--以下は本ユーザコントロールのViewModelにてバインドし表示--> 11 <ComboBox ItemsSource="{Binding People}" SelectedValue="Value" DisplayMemberPath="DisplayValue" 12 SelectedItem="{Binding SelectedAuthority,Mode=TwoWay}" HorizontalAlignment="Left" Height="25" VerticalAlignment="Top" Width="173" Margin="27,0,0,0"/> 13 <ComboBox ItemsSource="{Binding Authority}" SelectedValue="Value" DisplayMemberPath="DisplayValue" 14 SelectedItem="{Binding SelectedAuthority,Mode=TwoWay}" HorizontalAlignment="Left" Margin="210,0,0,0" VerticalAlignment="Top" Width="130" Height="25"/> 15 <Label Content="{Binding Indicator}" HorizontalAlignment="Left" Margin="0,30,0,0" VerticalAlignment="Top" Width="80" Height="30" FontSize="14" FontWeight="Bold" FontFamily="Yu Gothic UI Semibold"/> 16 </Grid> 17</UserControl>
[UserControlのクラスコード]
C#
1 public partial class ActionPanel : UserControl 2 { 3 public string No 4 { 5 get { return (string)this.GetValue(ActionPanel.NoProperty); } 6 set { this.SetValue(ActionPanel.NoProperty, value); } 7 } 8 9 public ActionPanel() 10 { 11 InitializeComponent(); 12 } 13 14 15 public static readonly DependencyProperty NoProperty = DependencyProperty.Register( 16 "No",typeof(string),typeof(ActionPanel), 17 new FrameworkPropertyMetadata("No", new PropertyChangedCallback(OnNoChanged))); 18 19 private static void OnNoChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 20 { 21 ActionPanel ctl = d as ActionPanel; //null checks omitted 22 string s = e.NewValue as string; //null checks omitted 23 if(ctl== null || s == string.Empty) 24 { 25 ctl.No = ""; 26 } 27 else 28 { 29 ctl.No = s; 30 } 31 } 32 }
具体的に実現したいこと
Window側に配置した追加・削除ボタンでユーザコントロールを動的に配置したいです。
このとき、縦に並べられればよく、現在Canvasを使って配置しておりますがこれより簡潔な手法があればご教授いただけますと幸いです。
加えて、デフォルトでユーザコントロールを配置した際に表示されるLabelコントロールの「↓」の表示をAnd・Orボタンにより「Or」や「And」に更新したいと思っております。
こうするためには参考にしたURLの通りICommandをユーザコントロール側に実装する必要がありますでしょうか?
もっと良い方法がございましたらご教授いただけますと幸いです。
補足情報(FW/ツールのバージョンなど)
・C#
・VisualStudio 2019
・.Net Framework 4.7.2
・使用しているフレームワーク:Prism
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/21 22:17
2021/04/22 05:00
2021/04/22 13:35
2021/04/22 13:56
2021/04/22 14:18
2021/04/24 12:54