Windows 8 数据绑定到Page.BottomAppBar中的ElementName

Windows 8 数据绑定到Page.BottomAppBar中的ElementName,windows-8,windows-runtime,winrt-xaml,Windows 8,Windows Runtime,Winrt Xaml,我试图将BottomAppBar内部的元素绑定到它外部的元素 下面是一个示例XAML来说明: <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> <TextBox x:Name="text" MinWidth="200" MinHeight="40" VerticalAlignment="Center" HorizontalAlignment="Center"/> <

我试图将BottomAppBar内部的元素绑定到它外部的元素

下面是一个示例XAML来说明:

<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
    <TextBox x:Name="text" MinWidth="200" MinHeight="40" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Grid>
<Page.BottomAppBar>
    <AppBar>
        <StackPanel Orientation="Horizontal">
            <Button Content="{Binding Text, ElementName=text}" Click="Button_Click_1"></Button>
            <Button Content="{Binding Text, ElementName=text2}" Click="Button_Click_1"></Button>
            <TextBox x:Name="text2" MinWidth="200" MinHeight="40" VerticalAlignment="Center" HorizontalAlignment="Center"/>
        </StackPanel>
    </AppBar>
</Page.BottomAppBar>

第一个按钮永远不会更新(它绑定到的文本框在BottomAppBar之外),但是第二个按钮会按预期更新。如何使页面对BottomAppBar可见?

您能试试这个吗

<Button Content="{Binding Path=text.Text}" Click="Button_Click_1"></Button>

我没有胆量说这是Bug,尽管我相信它是Bug,但我一直在解决这个困扰我一周的问题:

首先:这不仅适用于
BottomAppBar
toppbar
也存在同样的问题

Second:问题在于
ElementName
绑定仅在源元素是位于一个AppBar中的元素时有效,这意味着:

  • BottomAppBar
    (目标)到
    toppbar
    (源代码):有效
  • BottomAppBar
    (目标)到
    BottomAppBar
    (源代码):有效
  • TopAppBar
    (目标)到
    BottomAppBar
    (源代码):有效
  • TopAppBar
    (目标)到
    TopAppBar
    (源代码):有效
  • TopAppBar
    (目标)到
    两个AppBar
    (源代码)之外的内容:不工作
  • BottomAppBar
    (目标)到
    两个appbar
    (源代码)之外的内容:不工作
示例:

<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
    <TextBox x:Name="text" MinWidth="200" MinHeight="40" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Grid>
<Page.TopAppBar>
    <AppBar>
        <StackPanel Orientation="Horizontal">
            <Button Content="{Binding Text, ElementName=text}" Click="Button_Click_1"></Button>
            <Button Content="{Binding Text, ElementName=text2}" Click="Button_Click_1"></Button>
            <TextBox x:Name="text3" MinWidth="200" MinHeight="40" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<TextBox x:Name="text3" MinWidth="200" MinHeight="40" VerticalAlignment="Center" HorizontalAlignment="Center"/>

        </StackPanel>
    </AppBar>
</Page.TopAppBar>
<Page.BottomAppBar>
    <AppBar>
        <StackPanel Orientation="Horizontal">
            <Button Content="{Binding Text, ElementName=text}" Click="Button_Click_1"></Button>
            <Button Content="{Binding Text, ElementName=text3}" Click="Button_Click_1"></Button>
            <TextBox x:Name="text2" MinWidth="200" MinHeight="40" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<TextBox x:Name="text3" MinWidth="200" MinHeight="40" VerticalAlignment="Center" HorizontalAlignment="Center"/>

        </StackPanel>
    </AppBar>
</Page.BottomAppBar>

两个AppBars中的第一个按钮的内容不会显示任何内容,但是两个AppBars中的第二个按钮将正确显示


我发现AppBar从外部看到的唯一东西是根
Page
元素的
DataContext
,因此考虑在DataContext中使用backing属性来处理所有这些,这对我来说很好

它不起作用,因为“文本”文本框和按钮位于不同的视觉树中,所以按钮不知道“文本”。这样的绑定是不可能直接实现的,但存在解决方案。

如果在ViewModel中使用公共字符串属性,并在按钮和文本框中绑定该属性,会怎么样?实际情况更复杂-我试图简化该问题,尽管我可能可以处理该问题(我需要在“DefaultViewState”的一侧使用双向绑定)从这里开始。奇怪的是,这不能“开箱即用”。我看到了同样的行为。对我来说似乎是一个错误。我也有同样的问题,似乎是一个错误。谢谢你的回答。它不起作用-出于好奇-你为什么认为它会起作用?要让它起作用,AppBar上的DataContext应该是页面本身或页面本身什么的。那是你的想法吗?明白了。不,我没有那样做。再次感谢你的回答。