Stack Overflowの例のような分け方をしたことがないのでどういう意図かわかりませんが、この例では単にViewModel
にbool
を持っていればいいだけに見えます(DependencyProperty
を作るのが正しい場合もあるでしょうが)
View
に状態があるのならばViewModel
にも同じ状態を持たせ、それぞれBinding
すれば(回りくどく感じるかもしれませんが)疎結合を保てます。
xml:MainWindow.xaml
1<Window
2 x:Class="Questions257422.MainWindow"
3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5 xmlns:local="clr-namespace:Questions257422"
6 Width="800"
7 Height="450">
8 <Window.DataContext>
9 <local:ViewModel />
10 </Window.DataContext>
11 <DockPanel>
12 <local:Menu DockPanel.Dock="Top" />
13 <local:Pane />
14 </DockPanel>
15</Window>
xml:Menu.xaml
1<UserControl
2 x:Class="Questions257422.Menu"
3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
5 <Menu>
6 <MenuItem Header="メニュー1">
7 <MenuItem
8 Header="PaneEnabled"
9 IsCheckable="True"
10 IsChecked="{Binding PaneEnabled.Value}" />
11 <MenuItem
12 Header="LabelVisible"
13 IsCheckable="True"
14 IsChecked="{Binding LabelVisible.Value}" />
15 </MenuItem>
16 </Menu>
17</UserControl>
xml:Pane.xaml
1<UserControl
2 x:Class="Questions257422.Pane"
3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
5 <UserControl.Resources>
6 <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
7 </UserControl.Resources>
8 <StackPanel IsEnabled="{Binding PaneEnabled.Value}">
9 <Label Visibility="{Binding LabelVisible.Value, Converter={StaticResource BooleanToVisibilityConverter}}">ラベル</Label>
10 <Button Content="Pane" />
11 </StackPanel>
12</UserControl>
cs:ViewModel.cs
1using System.ComponentModel;
2using Reactive.Bindings;
3
4namespace Questions257422
5{
6 class ViewModel : INotifyPropertyChanged
7 {
8 public event PropertyChangedEventHandler PropertyChanged;
9
10 // ReactivePropertyを使用 ほかの手段でもいいです
11 public ReactiveProperty<bool> PaneEnabled { get; } = new ReactiveProperty<bool>();
12 public ReactiveProperty<bool> LabelVisible { get; } = new ReactiveProperty<bool>(true);
13 }
14}
各xaml.csは初期状態