为什么Popups中的数据绑定不起作用,尽管DataContexts是相同的?

时间:2015-11-15 17:05:46

标签: c# wpf data-binding

据我所知,DataContext通过逻辑树(或可视树,如果逻辑树被切断)级联。如果存在DataContext,则可以将数据绑定到其中一个属性。

每当我查看它时,我都会看到Popup的{​​{1}}与根DataContext对象的DataContext对象相同。

鉴于上述情况,为什么数据绑定不适用于Window s ???

这是我用于测试的代码:

Popup

Design appearance

代码隐藏:

<Window x:Class="TestPopup.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:l="clr-namespace:TestPopup"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <l:ViewModel/>
    </Window.DataContext>
    <StackPanel>
        <Button Margin="10" FontSize="30" Click="Button_OnClick">
            <Button.Tag>Positron</Button.Tag>
            <TextBlock>
                Shoot <Run Text="{Binding Tag, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Button}}}"/>s!
            </TextBlock>
        </Button>
        <Button Margin="10" FontSize="30" Click="Button_OnClick">
            <Button.Tag>Tachyon</Button.Tag>
            <TextBlock>
                Shoot <Run Text="{Binding Tag, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Button}}}"/>s!
            </TextBlock>
        </Button>
        <Popup Name="ThePopup" Placement="Center" StaysOpen="False" AllowsTransparency="True"
               PlacementTarget="{Binding RelativeSource={RelativeSource AncestorType={x:Type StackPanel}}}">
            <Border Background="White" BorderBrush="Black" BorderThickness="3" CornerRadius="20" Padding="5">
                <TextBlock Text="{Binding Charge}" FontSize="30"/>
            </Border>
        </Popup>
    </StackPanel>
</Window>

2 个答案:

答案 0 :(得分:0)

DataBinding通过可视化树级联。 弹出窗口不是可视树的一部分。

解决这个问题的一种方法是将x:Name添加到RootElement(或任何其他具有相关DataContext的元素),并在弹出窗口的绑定中添加ElementName = ...

例如:

db.collection.createIndex({ UrlLink: 1 }, { unique: true })

Placement =“Center”StaysOpen =“False”AllowTransparency =“True”                    PlacementTarget =“{Binding RelativeSource = {RelativeSource AncestorType = {x:Type Grid}}}”&gt;                                                                    

答案 1 :(得分:0)

弹出窗口不是可视化树的一部分,因此即使您为它们提供相同的DataContext,它也无法解析它。解决此问题的方法是通过a proxy binding as explained on this page提供。