62696


下記クラス図の通り、MainWindowView ⇔ MainWindowViewModel、DialogView ⇔
DialogViewModelはDataContext、DataTempleteで紐づいています。  
また、NavigationServiceを使用してDialogViewのFrameのPageを切り替えています。

Pageの部品とDialogViewModelのプロパティをBindingで紐づけたいのですが方法が分かりません。  
※NavigationServiseを使用してPage切替をしているため、Pageを動的に生成しています。

DialogViewでPageのインスタンス生成時に、PageのDataContextにDialogViewのDataContextを設定すれば、実現できるのは確認できました。できれば、Xaml上で同等の記述をしたいです。

* * *

**クラス図**  
[![クラス図](https://i.stack.imgur.com/vr4P2.png)](https://i.stack.imgur.com/vr4P2.png)

**ソースコード**

・ MainWindowView

[code]

    <Window x:Class="Apps.RelativeTestApp.App.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:vm="clr-namespace:Apps.RelativeTestApp.App"
        xmlns:local="clr-namespace:Apps.RelativeTestApp.App"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800"
        local:DialogAttachedBehavior.WindowViewModel="{Binding DialogViewModel}">
        <Window.DataContext>
            <vm:MainWindowViewModel />
        </Window.DataContext>
        <Window.Resources>
            <DataTemplate DataType="{x:Type vm:DialogViewModel}">
                <local:DialogView />
            </DataTemplate>
        </Window.Resources>
        <Grid>
            <Button Content="open" Command="{Binding OpenDialogCommand}" Margin="100"/>
        </Grid>
    </Window>
    
[/code]

・DialogView

[code]

    <UserControl x:Class="Apps.RelativeTestApp.App.DialogView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:Apps.RelativeTestApp.App"
         xmlns:vm="clr-namespace:Apps.RelativeTestApp.App"
         mc:Ignorable="d" 
         Height="450" Width="800">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="10*"/>
                <RowDefinition Height="90*"/>
            </Grid.RowDefinitions>
            <Label x:Name="TitleLabel" Content="{Binding Title}" Grid.Row="0"/>
            <Frame x:Name="PageFrame" Grid.Row="1" />
        </Grid>
    </UserControl>
    
[/code]


CC BY-SA 4.0
2020-01-31T05:22:31.303
62678
2020-02-01T14:37:31.293
2020-01-31T07:27:09.383
3060
32228
question
c# wpf mvvm
親ViewのViewModel⇔子ViewのBinding方法について


<https://stackoverflow.com/questions/3621424/page-datacontext-not-inherited-
from-parent-frame> に同様の質問を見つけました。

`Page`は`Frame`とは独立して動作しているようで、DataContextは継承されません。  
質問文にあるようにコードビハインドでの実装が正解かと思いますが、どうしてもXAMLのみで解決したい場合は以下のようにControlTemplateを定義することで`Page`が`Frame`のDataContextを参照するようになります。

[code]

    <Window.Resources>
        <Style TargetType="{x:Type Frame}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Frame}">
                        <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}">
                            <ContentPresenter x:Name="PART_FrameCP" DataContext="{TemplateBinding DataContext}" />
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <Trigger Property="NavigationUIVisibility" Value="Visible">
                    <Setter Property="Template" Value="{StaticResource FrameNavChromeTemplateKey}" />
                </Trigger>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="JournalOwnership" Value="OwnsJournal" />
                        <Condition Property="NavigationUIVisibility" Value="Automatic" />
                    </MultiTrigger.Conditions>
                    <Setter Property="Template" Value="{StaticResource FrameNavChromeTemplateKey}" />
                </MultiTrigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    
[/code]


CC BY-SA 4.0
2020-02-01T14:37:31.293
62696
2020-02-01T14:37:31.293
14817
62678
answer