環境
環境:VS2019
言語:C# WPF
ターゲットフレームワーク:.NET5
他にPrism をNugetでインストールしています。
前提・実現したいこと
ボタンコントロールのクリックで、ある要素のVisility の値を変更しようとしています。
この時、ボタンコントロールの各パラメータはObservableCollectionに入れ、Bindして表示しています。
任意のボタンが押されたとき、そのボタンをバインドしているコレクションの値と、その他のコレクションの値を変更したいと思っています(図2)。ただ現在は、クリックしたボタンにバインドしているコレクションのメソッドを呼び出す方法しかわからないため、他のコレクションの値を変更することができていません。
そこで、タイトルの質問になりますが、あるコレクションのメソッドから他のコレクションの値を変更する事ってできないですよね?
該当のソースコード
ViewModel
C#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6 7using Prism.Mvvm; 8using Prism.Commands; 9using System.Diagnostics;//Debug.WriteLine 10using System.ComponentModel;//PropertyChangedEventArgs 11using System.Collections.ObjectModel;//ObservableCollection 12 13namespace WpfApp1 14{ 15 class MainViewModel : BindableBase 16 { 17 /// <summary> 18 /// Menuリスト(View⇔ViewModel) 19 /// </summary> 20 public ObservableCollection<MenuModel> MenuModels{ get; private set; } 21 22 23 MainViewModel() 24 { 25 ObservableCollection<MenuModel> Tmp = new(); 26 Tmp.Add(new MenuModel() 27 { 28 SideMenuBackground = "#fff", 29 SideMenuForeground = "#000", 30 HomeMenuVisibility = "Collapsed", 31 SideMenuVisibility = "Visible", 32 Visibility = "Visible",//Hidden / Collapsed / Visible 33 Icon = "\xE10F", 34 Content = "HOME", 35 Note = "" 36 }); 37 Tmp.Add(new MenuModel() 38 { 39 SideMenuBackground = "{x:Null}", 40 SideMenuForeground = "#fff", 41 HomeMenuVisibility = "Visible", 42 SideMenuVisibility = "Visible", 43 Visibility = "Hidden",//Hidden / Collapsed / Visible 44 Icon = "\xF157", 45 Content = "CONTENT1", 46 Note = "Content1 です。ここには、content1 の説明が入ります。" 47 }); 48 Tmp.Add(new MenuModel() 49 { 50 SideMenuBackground = "{x:Null}", 51 SideMenuForeground = "#fff", 52 HomeMenuVisibility = "Visible", 53 SideMenuVisibility = "Visible", 54 Visibility = "Hidden",//Hidden / Collapsed / Visible 55 Icon = "\xF158", 56 Content = "CONTENT2", 57 Note = "Content2 です。ここには、content2 の説明が入ります。" 58 }); 59 Tmp.Add(new MenuModel() 60 { 61 SideMenuBackground = "{x:Null}", 62 SideMenuForeground = "#fff", 63 HomeMenuVisibility = "Visible", 64 SideMenuVisibility = "Visible", 65 Visibility = "Hidden",//Hidden / Collapsed / Visible 66 Icon = "\xF159", 67 Content = "CONTENT3", 68 Note = "Content3 です。ここには、content3 の説明が入ります。" 69 }); 70 this.MenuModels = Tmp; 71 } 72 73 public DelegateCommand<MenuModel> ClickMenu { get; } = new DelegateCommand<MenuModel>(x => 74 { 75 x.ChangeParameter(); 76 }); 77 } 78} 79
Model
C#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6 7using Prism.Mvvm; 8using Prism.Commands; 9using System.Diagnostics;//Debug.WriteLine 10using System.ComponentModel;//PropertyChangedEventArgs 11using System.Collections.ObjectModel;//ObservableCollection 12 13namespace WpfApp1 14{ 15 class MenuModel : BindableBase 16 { 17 /// <summary> 18 /// Side Menu の文字色 19 /// </summary> 20 private string _SideMenuForeground; 21 public string SideMenuForeground 22 { 23 get { return _SideMenuForeground; } 24 set { SetProperty(ref this._SideMenuForeground, value); } 25 } 26 /// <summary> 27 /// Side Menu の背景 28 /// </summary> 29 private string _SideMenuBackground; 30 public string SideMenuBackground 31 { 32 get { return _SideMenuBackground; } 33 set { SetProperty(ref this._SideMenuBackground, value); } 34 } 35 36 /// <summary> 37 /// Home Menu への表示・非表示 38 /// </summary> 39 private string _HomeMenuVisibility; 40 public string HomeMenuVisibility 41 { 42 get { return _HomeMenuVisibility; } 43 set { SetProperty(ref this._HomeMenuVisibility, value); } 44 } 45 /// <summary> 46 /// Side Menu への表示・非表示 47 /// </summary> 48 private string _SideMenuVisibility; 49 public string SideMenuVisibility 50 { 51 get { return _SideMenuVisibility; } 52 set { SetProperty(ref this._SideMenuVisibility, value); } 53 } 54 /// <summary> 55 /// Mainの表示・非表示 56 /// </summary> 57 private string _Visibility; 58 public string Visibility 59 { 60 get { return _Visibility; } 61 set { SetProperty(ref this._Visibility, value); } 62 } 63 /// <summary> 64 /// アイコン 65 /// </summary> 66 private string _Icon; 67 public string Icon 68 { 69 get { return this._Icon; } 70 set { SetProperty(ref this._Icon, value); } 71 } 72 73 /// <summary> 74 /// コンテンツ名 75 /// </summary> 76 private string _Content; 77 public string Content 78 { 79 get { return this._Content; } 80 set { SetProperty(ref this._Content, value); } 81 } 82 /// <summary> 83 /// 説明 84 /// </summary> 85 private string _Note; 86 public string Note 87 { 88 get { return this._Note; } 89 set { SetProperty(ref this._Note, value); } 90 } 91 92 public void ChangeParameter() 93 { 94 Debug.WriteLine($"ChangeParameter : {this.Content}"); 95 this.Visibility = "Visible"; 96 this.SideMenuBackground = "#fff"; 97 this.SideMenuForeground = "#000"; 98 } 99 } 100} 101 102
View
XAML
1<Window x:Class="WpfApp1.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:WpfApp1" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="14.2cm" Width="23cm" MinHeight="14.2cm" MinWidth="13cm"> 9 10 <Window.DataContext> 11 <local:MainViewModel/> 12 </Window.DataContext> 13 14 <Grid> 15 <Grid.ColumnDefinitions> 16 <ColumnDefinition Width="2cm"/> 17 <ColumnDefinition MinWidth="21"/> 18 </Grid.ColumnDefinitions> 19 20 21 <!--HOME--> 22 <Grid Grid.Column="1" Visibility="{Binding MenuModels[0].Visibility}"> 23 <ScrollViewer> 24 <StackPanel> 25 <TextBlock 26 Margin="15,15,0,0" 27 FontSize="23pt" 28 Text="{Binding MenuModels[0].Content}" 29 Foreground="#808080" /> 30 31 <ItemsControl x:Name="MyItems" ItemsSource="{Binding MenuModels}"> 32 <ItemsControl.ItemTemplate> 33 <DataTemplate> 34 <Grid Margin="15,15,0,0" Visibility="{Binding HomeMenuVisibility}"> 35 <Border Background="#efebe9" CornerRadius="10" ></Border> 36 <Button 37 Command="{Binding ElementName=MyItems, Path=DataContext.ClickMenu}" 38 CommandParameter="{Binding}" 39 Background="{x:Null}" 40 BorderThickness="0" 41 Width="350" 42 Height="160"> 43 <StackPanel Margin="10" Width="330" Height="140"> 44 <StackPanel Orientation="Horizontal"> 45 <TextBlock Text="{Binding Icon}" 46 FontFamily="Segoe MDL2 Assets" 47 FontSize="18pt" 48 Margin="10,0,10,0" 49 HorizontalAlignment="Center" 50 VerticalAlignment="Center"/> 51 <TextBlock Text="{Binding Content}" 52 FontSize="18pt"/> 53 </StackPanel> 54 <TextBlock 55 FontSize="11pt" 56 TextWrapping="Wrap" 57 Text="{Binding Note}"/> 58 </StackPanel> 59 </Button> 60 </Grid> 61 </DataTemplate> 62 </ItemsControl.ItemTemplate> 63 <ItemsControl.ItemsPanel> 64 <ItemsPanelTemplate> 65 <WrapPanel HorizontalAlignment="Center" Margin="0,0,0,0"/> 66 </ItemsPanelTemplate> 67 </ItemsControl.ItemsPanel> 68 </ItemsControl> 69 </StackPanel> 70 71 </ScrollViewer> 72 </Grid> 73 74 <!--CONTENT1--> 75 <Grid Grid.Column="1" Visibility="{Binding MenuModels[1].Visibility}"> 76 <ScrollViewer> 77 <StackPanel> 78 <TextBlock 79 Margin="15,15,0,0" 80 FontSize="23pt" 81 Text="{Binding MenuModels[1].Content}" 82 Foreground="#808080" /> 83 </StackPanel> 84 </ScrollViewer> 85 </Grid> 86 87 88 <!--CONTENT2--> 89 <Grid Grid.Column="1" Visibility="{Binding MenuModels[2].Visibility}"> 90 <ScrollViewer> 91 <StackPanel> 92 <TextBlock 93 Margin="15,15,0,0" 94 FontSize="23pt" 95 Text="{Binding MenuModels[2].Content}" 96 Foreground="#808080" /> 97 </StackPanel> 98 </ScrollViewer> 99 </Grid> 100 101 102 <!--CONTENT3--> 103 <Grid Grid.Column="1" Visibility="{Binding MenuModels[3].Visibility}"> 104 <ScrollViewer> 105 <StackPanel> 106 <TextBlock 107 Margin="15,15,0,0" 108 FontSize="23pt" 109 Text="{Binding MenuModels[3].Content}" 110 Foreground="#808080" /> 111 </StackPanel> 112 </ScrollViewer> 113 </Grid> 114 115 116 <!--サイドバー--> 117 <Grid Grid.Column="0" Background="#808080" > 118 119 <ItemsControl x:Name="MyItemsMenu" ItemsSource="{Binding MenuModels}"> 120 <ItemsControl.ItemTemplate> 121 <DataTemplate> 122 <Button 123 Command="{Binding ElementName=MyItemsMenu, Path=DataContext.ClickMenu}" 124 CommandParameter="{Binding}" 125 BorderThickness="0" 126 Background="{Binding SideMenuBackground}" 127 Margin="0,0,0,0" 128 Padding="10" 129 Foreground="{Binding SideMenuForeground}" > 130 <StackPanel> 131 <TextBlock 132 TextAlignment="Center" 133 FontSize="26pt" 134 Text="{Binding Icon}" 135 FontFamily="Segoe MDL2 Assets"/> 136 <TextBlock 137 TextAlignment="Center" 138 FontSize="8pt" 139 Text="{Binding Content}"/> 140 </StackPanel> 141 </Button> 142 </DataTemplate> 143 </ItemsControl.ItemTemplate> 144 <ItemsControl.ItemsPanel> 145 <ItemsPanelTemplate> 146 <StackPanel/> 147 </ItemsPanelTemplate> 148 </ItemsControl.ItemsPanel> 149 </ItemsControl> 150 </Grid> 151 </Grid> 152</Window> 153 154
回答2件
あなたの回答
tips
プレビュー