奇怪的“heisenbug”为combobox有两个列和一个标题

时间:2014-08-21 11:38:44

标签: c# wpf combobox multiple-columns heisenbug

基于this SO问题,我创建了一个包含2列和标题的组合框。但是,我需要按比例分隔列,因此我删除了共享大小组,并将宽度更改为"*"。为了拉伸网格,我在HorizontalContentAlignment本身添加了ComboBox。请参阅下面的完整xaml

这适用于具有实际数据的行,但标题保持左对齐。但是,当我用Snoop检查时,我注意到标题很好。

显然,当我选择包含标题的ComboBoxItem时,布局会得到纠正(因此,heisenbug)。

为什么会这样?你怎么解决这个问题?在按比例间隔布局时,是否采用了错误的方法?

ComboBox看起来像这样。员工是一个简单的POCO,集合是Collection<Employee>的子类,使其在XAML中工作。完整项目可在此gist中找到。

重现这一点:

  1. 启动应用程序
  2. 启动Snoop,并检查应用程序
  3. 打开comboBox,并检查元素
  4. 选择第一个ComboBoxItem

        <ComboBox Name="cb" ItemsSource="{DynamicResource items}" HorizontalContentAlignment="Stretch">
        <ComboBox.DataContext>
            <obj:EmployeeCollection>
                <obj:Employee Name="John" Occupation="Developer" />
                <obj:Employee Name="Jack" Occupation="Spy" />
            </obj:EmployeeCollection>
        </ComboBox.DataContext>
        <ComboBox.Resources>
            <CompositeCollection x:Key="items">
                <ComboBoxItem IsEnabled="False">
                    <Grid TextElement.FontWeight="Bold">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition />
                            <ColumnDefinition />
                        </Grid.ColumnDefinitions>
                        <Grid.Children>
                            <TextBlock Grid.Column="0" Text="Name"/>
                            <TextBlock Grid.Column="1" Text="Occupation"/>
                        </Grid.Children>
                    </Grid>
                </ComboBoxItem>
                <Separator/>
                <CollectionContainer Collection="{Binding Source={x:Reference cb}, Path=DataContext}"/>
            </CompositeCollection>
            <DataTemplate DataType="{x:Type obj:Employee}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                    <Grid.Children>
                        <TextBlock Grid.Column="0" Text="{Binding Name}"/>
                        <TextBlock Grid.Column="1" Text="{Binding Occupation}"/>
                    </Grid.Children>
                </Grid>
            </DataTemplate>
        </ComboBox.Resources>
    </ComboBox>
    

1 个答案:

答案 0 :(得分:1)

我没有遇到和你一样的问题。字幕总是保持完全左对齐,当我通过XAML Spy选择它时也不会(我不使用Snoop)。但只需在标题HorizontalContentAlignment="Stretch"中添加ComboBoxItem即可解决问题。

XAML Spy报告HorizontalContentAlignmentLeft