WPF中ComboBox模板问题

3
我有一个带有DataTemplate的listview,其中包含一个ComboBox。我希望ComboBox在用户想要更改值之前看起来像标签一样平坦。我之前有下面的示例工作正常,但是我稍微改变了一些东西,现在它不再工作,我不确定原因。
IsMouseOver属性似乎没有正常工作,因为它只在鼠标位于控件边框时才设置。
我该怎么做才能使其正确工作?
以下是代码片段:
    <CollectionViewSource x:Key="AccountCategories" />

    <ControlTemplate x:Key="FlatCombo" TargetType="{x:Type ComboBox}">
        <ContentControl
            Content="{TemplateBinding SelectionBoxItem}"
            ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}"
            ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"

            Margin="4,3,3,3" 
            />
    </ControlTemplate>

    <Style TargetType="{x:Type ComboBox}" x:Key="DropDown">
        <Setter Property="OverridesDefaultStyle" Value="False" />            
        <Style.Triggers> 
            <MultiTrigger>
                <MultiTrigger.Conditions>
                    <Condition Property="IsMouseOver" Value="False" />                       
                    <Condition Property="IsFocused" Value="False"/>
                </MultiTrigger.Conditions>
                <Setter Property="Template" Value="{StaticResource FlatCombo}" />
            </MultiTrigger>
        </Style.Triggers>
    </Style>

    <DataTemplate x:Key="Category">
        <ComboBox IsSynchronizedWithCurrentItem="False" Style="{StaticResource DropDown}"
                                      ItemsSource="{Binding Source={StaticResource db}, Path=Categories}" DisplayMemberPath="Name" SelectedValuePath="Id" SelectedValue="{Binding Path=Category}" />
    </DataTemplate>
</Window.Resources>

<Grid>


    <ListView Margin="0,110,0,0" Name="lstCategories" ItemsSource="{Binding Source={StaticResource AccountCategories}}" Grid.RowSpan="2">
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment" Value="Stretch" />
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Category" Width="100"  CellTemplate="{StaticResource Category}" />
                <GridViewColumn DisplayMemberBinding="{Binding Path=Balance}" Header="Balance" Width="100" />
            </GridView>
        </ListView.View>
    </ListView>

2个回答

2
我使用您提供的代码,为集合提供了一些数据,它就像您想要的那样正常工作。我建议使用Snoop查看是否有其他元素正在消耗您希望ListView处理的事件。

哈哈,结果发现是窗口顶部的标签。高度一直延伸到窗口底部,覆盖了 ListBox 中的大部分列。 - Excel Kobayashi
有人可以发布此示例的支持类吗? - user38349

0
通常,当您遇到鼠标事件无法正确触发的问题时,这是由于缺少背景所致。如果您期望接收事件的元素具有空引用的背景,则控件将无法接收事件;只有它下面的控件才会接收到事件。尝试将ContentControl的背景设置为“透明”。这应该可以解决您的问题。

不行,看起来它什么也没做。如果我改成按钮,还是一样。它的行为就像有一个看不见的东西挡在它前面;当我尝试点击时,甚至连ListViewItem都无法选择。 - Excel Kobayashi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接