【问题标题】:problem with wpf datagrid selection + expanderwpf数据网格选择+扩展器的问题
【发布时间】:2011-11-19 19:33:10
【问题描述】:

我有一个扩展器,其中包含一个带有 rowdetails 模板的数据网格。

当我单击数据网格行以查看行详细信息模板时,扩展器将关闭!

有人知道为什么以及如何解决这个问题吗?

更新

原来还有别的事情发生:

扩展器都包含在 TabItem 中。当我单击网格行时,TabControls.SelectionChanged 触发(WHY!!!?!?!!?!?!?!),然后重新计算并重新计算数据。

所以真正的问题是为什么单击 DataGrid 行会导致父 TabControl 的 SelectionChanged 事件触发?这是 XAML:

<Window xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"  x:Class="BPPDemo.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:BPPDemo"
    Title="BPP Demo" Height="600" Width="700" Loaded="Window_Loaded">

<Window.Resources>
    <local:AddrStatusColorConverter x:Key="addressStatusColorConverter"/>

    <local:BoolToVisConverter x:Key="boolToVisConverter"/>
</Window.Resources>

<DockPanel>
    <Menu DockPanel.Dock="Top">
        <Menu.Items>
            <MenuItem Header="File">
                <MenuItem Header="Open Assessment" Command="{Binding SelectAssessmentCommand}"></MenuItem>
                <MenuItem Header="Import Properties" Command="{Binding ImportPropertiesCommand}"></MenuItem>
            </MenuItem>
            <MenuItem Header="Properties" Visibility="{Binding IsSelected, ElementName=tabProperties,Converter={StaticResource boolToVisConverter}}">
                <MenuItem Header="Delete All Properties" Command="{Binding DeleteAllPropertiesCommand}"></MenuItem>
                <MenuItem Header="Resolve Invalid Addresses" Command="{Binding ValidateAddressesCommand}"></MenuItem>
                <MenuItem Header="Select Situs" Command="{Binding SelectSitusCommand}"/>
            </MenuItem>
        </Menu.Items>
    </Menu>

    <DockPanel Margin="10">
        <TextBlock Text="{Binding Assessment.Name}" FontWeight="Normal" FontSize="24" Foreground="#FF5C9EB7" DockPanel.Dock="Top" Margin="0,0,0,10"/>
        <TabControl SelectionChanged="TabControl_SelectionChanged">
            <TabItem x:Name="tabProperties" Header="Properties">
                <DataGrid ItemsSource="{Binding Properties}" AutoGenerateColumns="False" IsReadOnly="True" SelectedItem="{Binding SelectedProperty,Mode=TwoWay}">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Description" Binding="{Binding Description}"/>
                        <DataGridTextColumn Header="Cost" Binding="{Binding Cost,StringFormat='{}{0:c}'}"/>
                        <DataGridTextColumn Header="Year Acquired" Binding="{Binding YearAcquired}"/>
                        <DataGridTextColumn Header="Life In Years" Binding="{Binding LifeInYears}"/>
                        <DataGridTextColumn Header="Schedule" Binding="{Binding Schedule}"/>
                        <DataGridTextColumn Header="Current Value" Binding="{Binding CurrentValue,StringFormat='{}{0:c}'}" />
                        <DataGridTextColumn Header="Tax" Binding="{Binding Tax,StringFormat='{}{0:c}'}" />

                        <DataGridTemplateColumn Header="Address">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding Address}" Foreground="{Binding AddressStatus, Converter={StaticResource addressStatusColorConverter}}"/>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>
                        <DataGridTextColumn Header="Address Status" Binding="{Binding AddressStatus}"/>
                        <DataGridTextColumn Header="Situs" Binding="{Binding Situs}"/>
                    </DataGrid.Columns>

                    <DataGrid.RowDetailsTemplate>
                        <DataTemplate>
                            <TextBlock>THIS ONE WORKS! WHY DOESN'T THE OTHER ONE????</TextBlock>
                        </DataTemplate>
                    </DataGrid.RowDetailsTemplate>


                </DataGrid>
            </TabItem>
            <TabItem Header="Listings" Name="tabListings">

                <DataGrid x:Name="SitusGroups" AutoGenerateColumns="false" SelectionMode="Single" SelectionUnit="FullRow">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Situs" Binding="{Binding Situs,StringFormat='{}{0:c}',TargetNullValue='none'}"></DataGridTextColumn>
                        <DataGridTextColumn Header="Cost" Binding="{Binding Cost,StringFormat='{}{0:c}'}"></DataGridTextColumn>
                        <DataGridTextColumn Header="Value" Binding="{Binding Value,StringFormat='{}{0:c}'}"></DataGridTextColumn>
                        <DataGridTextColumn Header="Tax" Binding="{Binding Tax,StringFormat='{}{0:c}'}"></DataGridTextColumn>
                    </DataGrid.Columns>

                    <DataGrid.RowDetailsTemplate>
                        <DataTemplate>
                            <TextBlock>I JUST WANT TO SEE THIS WHEN I CLICK ON A ROW!</TextBlock>
                        </DataTemplate>
                    </DataGrid.RowDetailsTemplate>

                </DataGrid>

               

            </TabItem>
        </TabControl>

    </DockPanel>

</DockPanel>

【问题讨论】:

  • 你能展示你的 XAML 吗?

标签: c# .net wpf datagrid expander


【解决方案1】:

问题与事件的路由方式有关。 TabControl 和 DataGrid 派生自同一个类,因此当 DataGrid SelectionChanged 时,我的 TabControl SelectionChanged 处理程序被触发。

正如http://www.trentfguidry.net/post/2009/06/13/WPF-TabControl-SelectionChanged.aspx 的最后一条评论所暗示的,我在事件处理程序中检查了原始源,如果引用不是我的 tabcontrol,则返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多