C# 为什么不是';我的WPF弹出窗口显示它应该在哪里

C# 为什么不是';我的WPF弹出窗口显示它应该在哪里,c#,wpf,user-interface,datagrid,popup,C#,Wpf,User Interface,Datagrid,Popup,我试着遵循这个指南:当按下datagrid列标题中的按钮时,添加一个小的弹出窗口。我在列标题中添加了一个过滤器按钮和图标,并将弹出窗口的放置目标设置为该按钮,但弹出窗口始终显示在整个窗口的左下角 <DataGridTemplateColumn.HeaderTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> &

我试着遵循这个指南:当按下datagrid列标题中的按钮时,添加一个小的弹出窗口。我在列标题中添加了一个过滤器按钮和图标,并将弹出窗口的放置目标设置为该按钮,但弹出窗口始终显示在整个窗口的左下角

    <DataGridTemplateColumn.HeaderTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Image Source="Images\bios.png" Width="16" Height="16"/>
                <TextBlock Text="Model" TextWrapping="Wrap" Padding="3"/>
                <Button Name="btnModelFilter" Margin="3,0,0,0" Click="btnModelFilter_Click">
                    <Button.Template>
                        <ControlTemplate>
                            <Image Source="Images\filter.png" Width="10" Height="10"/>
                        </ControlTemplate>
                    </Button.Template>
                </Button>
            </StackPanel>
        </DataTemplate>
    </DataGridTemplateColumn.HeaderTemplate>                    
</DataGridTemplateColumn>
知道原因吗

    <DataGridTemplateColumn.HeaderTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Image Source="Images\bios.png" Width="16" Height="16"/>
                <TextBlock Text="Model" TextWrapping="Wrap" Padding="3"/>
                <Button Name="btnModelFilter" Margin="3,0,0,0" Click="btnModelFilter_Click">
                    <Button.Template>
                        <ControlTemplate>
                            <Image Source="Images\filter.png" Width="10" Height="10"/>
                        </ControlTemplate>
                    </Button.Template>
                </Button>
            </StackPanel>
        </DataTemplate>
    </DataGridTemplateColumn.HeaderTemplate>                    
</DataGridTemplateColumn>
数据网格列

    <DataGridTemplateColumn.HeaderTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Image Source="Images\bios.png" Width="16" Height="16"/>
                <TextBlock Text="Model" TextWrapping="Wrap" Padding="3"/>
                <Button Name="btnModelFilter" Margin="3,0,0,0" Click="btnModelFilter_Click">
                    <Button.Template>
                        <ControlTemplate>
                            <Image Source="Images\filter.png" Width="10" Height="10"/>
                        </ControlTemplate>
                    </Button.Template>
                </Button>
            </StackPanel>
        </DataTemplate>
    </DataGridTemplateColumn.HeaderTemplate>                    
</DataGridTemplateColumn>

弹出窗口

    <DataGridTemplateColumn.HeaderTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Image Source="Images\bios.png" Width="16" Height="16"/>
                <TextBlock Text="Model" TextWrapping="Wrap" Padding="3"/>
                <Button Name="btnModelFilter" Margin="3,0,0,0" Click="btnModelFilter_Click">
                    <Button.Template>
                        <ControlTemplate>
                            <Image Source="Images\filter.png" Width="10" Height="10"/>
                        </ControlTemplate>
                    </Button.Template>
                </Button>
            </StackPanel>
        </DataTemplate>
    </DataGridTemplateColumn.HeaderTemplate>                    
</DataGridTemplateColumn>
<Popup Name="popModel" Placement="Bottom" PlacementTarget="{Binding ElementName=btnModelFilter}" StaysOpen="False" Width="200">
    <Border Background="White" BorderBrush="Gray" BorderThickness="1,1,1,1">
        <StackPanel Margin="5,5,5,15">
            <StackPanel Orientation="Horizontal" Margin="0,0,0,15">
                <Button Margin="0,0,0,0" Name="btnSelectAll" Click="btnSelectAll_Click">
                    <Button.Template>
                        <ControlTemplate>
                            <TextBlock Text="Select All" Foreground="Blue" Cursor="Hand" />
                        </ControlTemplate>
                    </Button.Template>
                </Button>

                <Button Margin="10,0,0,0" Name="btnUnselectAll" Click="btnUnselectAll_Click">
                    <Button.Template>
                        <ControlTemplate>
                            <TextBlock Text="Select None" Foreground="Blue" Cursor="Hand" />
                        </ControlTemplate>
                    </Button.Template>
                </Button>
            </StackPanel>

            <ListBox x:Name="lstModels" BorderThickness="0">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <CheckBox IsChecked="{Binding IsChecked}" Content="{Binding Item}" Checked="ApplyFilters" Unchecked="ApplyFilters" />
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

        </StackPanel>
    </Border>
</Popup>

由于按钮的名称属性是在DataTemplate中定义的,因此名称的范围不会超出DataTemplate,因此找不到按钮,弹出窗口显示在0,0处。
此作用域规则是合乎逻辑的,因为假设您多次重复使用DataTemplate,则使用相同的按钮名称将引发编译器错误。

您可以将弹出窗口定义为带有键的样式,并将其直接包含在标题数据模板中。

假设您的弹出窗口位于
btnModelFilter
的同一堆栈面板中,我认为您的堆栈面板(btnModelFilter的父级)应该是弹出窗口的放置目标,而不是
btnModelFilter

    <DataGridTemplateColumn.HeaderTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Image Source="Images\bios.png" Width="16" Height="16"/>
                <TextBlock Text="Model" TextWrapping="Wrap" Padding="3"/>
                <Button Name="btnModelFilter" Margin="3,0,0,0" Click="btnModelFilter_Click">
                    <Button.Template>
                        <ControlTemplate>
                            <Image Source="Images\filter.png" Width="10" Height="10"/>
                        </ControlTemplate>
                    </Button.Template>
                </Button>
            </StackPanel>
        </DataTemplate>
    </DataGridTemplateColumn.HeaderTemplate>                    
</DataGridTemplateColumn>