WPF自定义组合框显示"System.Windows.Styles"在项目

本文关键字:quot Windows Styles 项目 System 自定义 显示 组合 WPF | 更新日期: 2023-09-27 18:12:25

我创建了一个自定义的WPF组合框:

<ComboBox 
    x:Name="ComboBoxBtn" 
    VerticalAlignment="Top" 
    HorizontalAlignment="Left" 
    Margin="0,0,0,-1" 
    Width="300" 
    ItemsSource="{Binding Source, RelativeSource={RelativeSource AncestorType=UserControl}}"
    SelectedItem="{Binding Path=Selected, Mode=TwoWay, RelativeSource={RelativeSource AncestorType=UserControl}}"
        IsSynchronizedWithCurrentItem="True">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <ContentControl>
                    <Style TargetType="ContentControl">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Favorite}" Value="True">
                                <Setter Property="Content">
                                    <Setter.Value>
                                        <Grid>
                                            <Grid.Style>
                                                <Style TargetType="Grid">
                                                    <Setter Property="Background" Value="#FFE6E6FA"/>
                                                </Style>
                                            </Grid.Style>
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="Auto" />
                                                <ColumnDefinition Width="Auto" />
                                            </Grid.ColumnDefinitions>
                                            <Label Content="{Binding}" Width="250" />
                                            <Button Grid.Column="1" Command="{Binding AddCommandButton, ElementName=root}"
                                                CommandParameter="{Binding}">+</Button>
                                        </Grid>
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding Favorite}" Value="False">
                                <Setter Property="Content">
                                    <Setter.Value>
                                        <Grid>
                                            <Grid.Style>
                                                <Style TargetType="Grid">
                                                    <Setter Property="Background" Value="Yellow"/>
                                                </Style>
                                            </Grid.Style>
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="Auto" />
                                                <ColumnDefinition Width="Auto" />
                                            </Grid.ColumnDefinitions>
                                            <Label Content="{Binding}" Width="250" />
                                            <Button Grid.Column="1" Command="{Binding RemoveCommandButton, ElementName=root}"
                                                CommandParameter="{Binding}">-</Button>
                                        </Grid>
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </ContentControl>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

Source绑定包含一个ObservableColleciton,其中客户端有一个Favorite字段,并且应该显示不同的背景和不同的按钮。但是当我打开ComboBox所有的项目都有:

"System.Windows.Styles"

WPF自定义组合框显示"System.Windows.Styles"在项目

您的问题是您在内容控件中将Style设置为Content。

<ContentControl>
    <Style TargetType="ContentControl">
    ...
    </Style>
</ContentControl>

为了设置内容控件的样式,你应该添加:

<ContentControl.Style>
所以上面的代码看起来像这样:
<ContentControl>    
    <ContentControl.Style>
        <Style TargetType="ContentControl">
        ...
        </Style>    
    <ContentControl.Style>
</ContentControl>

编辑顺便说一下,对于更改背景的简单任务来说,您的代码非常复杂。下面是一个简化的版本:
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <Grid Name="PART_GRID" Background="Yellow">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>
                <Label Content="{Binding}"
                       Width="250" />
                <Button Name="PART_BUTTON"
                        Grid.Column="1"
                        Content="-"
                        Command="{Binding AddCommandButton, ElementName=root}"
                        CommandParameter="{Binding}" />
            </Grid>
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding Favorite}"
                             Value="True">
                    <Setter TargetName="PART_GRID"
                            Property="Background"
                            Value="#FFE6E6FA" />
                    <Setter TargetName="PART_BUTTON"
                            Property="Content"
                            Value="+" />
                    <Setter TargetName="PART_BUTTON"
                            Property="Command"
                            Value="{Binding RemoveCommandButton, ElementName=root}" />
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ComboBox.ItemTemplate>

在我的例子中,我发现我有:

<ComboBox>
    <Style>
    </Style>
</ComboBox>

直接添加样式作为项,这与上面的解决方案类似。