30717


C# WPF/MVVM にて、次のように異なるxamlにある要素へBindingする方法がわかりません。  
この場合、Menu.xamlにあるIsCheckedとPane.xamlにあるIsEnabledを紐付けするにはどうしたらいいですか？

・Menu.xaml

[code]

    <UserControl x:Class="Sample.Menu" ...>
      <Menu>
        <MenuItem Header="メニュー1">
          <MenuItem Header="項目1" 
            IsCheckable="True"
            IsChecked="{Binding IsEnabled, ElementName=Pane1}" />
        </MenuItem>
      </Menu>
    </UserControl>
    
[/code]

・Pane.xaml

[code]

    <UserControl x:Class="Sample.Pane" ...>
      <Grid>
        <StackPanel x:Name="Pane1" IsEnabled="False">...</StackPanel>
      </Grid>
    </UserControl>
    
[/code]

・MainWindow.xaml

[code]

    <Window x:Class="Sample.MainWindow" ...>
      <Grid>
        <local:Menu />
        <local:Pane Grid.Row="1" />
      </Grid>
    </Window>
    
[/code]


CC BY-SA 3.0
2016-11-27T03:55:14.550
30707
2016-11-27T07:53:44.970
2016-11-27T04:15:03.737
19736
19736
question
c# wpf mvvm
C# WPF/MVVM 異なるxamlにある要素へBindingする方法は？


それぞれの`UserControl`内部のプロパティを`UserControl`のプロパティにバインドすればよいです。

たとえば`Pane.IsEnabled`にバインドするためには以下のようになります。

[code]

    <UserControl>
        <Grid>
            <StackPanel
                IsEnabled="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=IsEnabled}">
            </StackPanel>
        </Grid>
    </UserControl>
    
[/code]

バインド対象のプロパティは独自に定義してもよいです。

[code]

    // Menu.xaml.cs
    public bool IsEnabled2
    {
        get { return (bool)GetValue(IsEnabled2Property); }
        set { SetValue(IsEnabled2Property, value); }
    }
    
    public static readonly DependencyProperty IsEnabled2Property =
        DependencyProperty.Register("IsEnabled2", typeof(bool), typeof(Menu), new PropertyMetadata(true));
    
[/code]

なお上記の定義はエディター上で`propdp`と入力し、タブキーを二回押すと生成することが出来ます。

最後に`MainWindow`内で通常の`ElementName`を使用した`{Binding}`で相互にバインドを行います。

[code]

    <local:Menu
        x:Name="menu" />
    <local:Pane
        IsEnabled="{Binding ElementName=menu, Path=IsEnabled2}" />
    
[/code]


CC BY-SA 3.0
2016-11-27T07:53:44.970
30717
2016-11-27T07:53:44.970
5750
30707
answer