WPF窗口/框架/页面

时间:2018-08-17 19:43:16

标签: wpf xaml window

我有一个窗口,其中包含一个包含以下内容的网格:标签和框架。框架可容纳一页。该页面具有一个按钮和一个标签。

两个标签(在Window和Page上)都绑定到相同的字符串属性,该属性最初可以正常工作。

按钮(在页面上)会更改字符串属性,我希望这会同时更改窗口上的标签和页面上的标签。

问题在于它仅更改页面上的标签,而不更改窗口上的标签。有没有一种方法可以让页面上的按钮更改其父窗口中的元素?另外,如果有解释为什么会发生这种情况,我将不胜感激。

ViewModel with Output Screen Shots

Window Xaml:

<Window.DataContext>
        <ViewModel:MainWindowViewModel/>
</Window.DataContext>

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>

        <Label Content="{Binding SourceTitleHeader, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" 
               HorizontalAlignment="Left"
               Foreground="Red">
        </Label>
    </Grid>

    <Frame Grid.Row="1" Grid.Column="0" Source="\Views\Page1.xaml">

    </Frame>

</Grid>

Page Xaml:

<Page.DataContext>
    <ViewModel:MainWindowViewModel/>
</Page.DataContext>

<StackPanel Margin="10">
    <Label Content="{Binding SourceTitleHeader, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" 
           HorizontalAlignment="Left"
           Margin="0 0 0 20">

    </Label>

    <Button Content="ChangeLabel" Width="100" Height="30" HorizontalAlignment="Left"
            Command="{Binding Refresh_Screen_Command}">

    </Button>
</StackPanel>

1 个答案:

答案 0 :(得分:1)

您有两个不同的对象用于窗口和页面的DataContext,请确保您使用的对象相同。

<Window.Resources>
    <ResourceDictionary>
        <local:MainWindowViewModel x:Key="ViewModel" />
    </ResourceDictionary>
</Window.Resources>
<Grid DataContext="{StaticResource ViewModel}">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>

        <Label Content="{Binding SourceTitleHeader, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
           HorizontalAlignment="Left"
           Foreground="Red">
        </Label>
    </Grid>

    <Frame Grid.Row="1" Grid.Column="0">
        <Frame.Content>
            <local:Page1 DataContext="{StaticResource ViewModel}" />
        </Frame.Content>
    </Frame>

</Grid>