首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在UWP中使用带有ComboBox ItemContainerStyle的DataTrigger?

如何在UWP中使用带有ComboBox ItemContainerStyle的DataTrigger?
EN

Stack Overflow用户
提问于 2018-09-27 06:52:39
回答 2查看 819关注 0票数 0

我正在尝试根据分配给ComboBox ItemSource的属性值来更改ComboBoxItem的值。

我知道在WPF中它可以实现如下:

代码语言:javascript
复制
 <ComboBox.ItemContainerStyle>
                    <Style TargetType="{x:Type ComboBoxItem}">
                        <Setter Property="Background" Value="#FFD2D2" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding IsValid}" Value="True">
                                <Setter Property="Background" Value="Green" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
  </ComboBox.ItemContainerStyle>

在UWP中,我尝试使用行为,但仍然不起作用。

代码语言:javascript
复制
   <ComboBox.ItemContainerStyle>
                        <Style TargetType="ComboBoxItem">
                            <Setter Property="Background" Value="Transparent" />
                            <interactivity:Interaction.Behaviors>
                                <core:DataTriggerBehavior Binding="{Binding IsValid}" Value="True">
                                    <core:ChangePropertyAction PropertyName="Background" Value="{ThemeResource MyBorderBrush}" />
                                </core:DataTriggerBehavior>
                            </interactivity:Interaction.Behaviors>
                        </Style>
   </ComboBox.ItemContainerStyle>

我也尝试使用VSM,但不确定如何应用条件值。

代码语言:javascript
复制
 <Style TargetType="ComboBoxItem">
                            <Setter Property="Background" Value="Transparent" />
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="ComboBoxItem">
                                        <Grid x:Name="LayoutRoot" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}">
                                            <VisualStateManager.VisualStateGroups>
                                                <VisualStateGroup x:Name="CommonStates">
                                                    <VisualState x:Name="Normal">
                                                        <Storyboard>
                                                            // What should go here?
                                                        </Storyboard>
                                                    </VisualState>
                                                </VisualStateGroup>
                                            </VisualStateManager.VisualStateGroups>
                                        </Grid>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
</Style>

编辑:

我更喜欢设置ComboBoxItem本身的背景的解决方案,而不是创建单独的网格/边框,然后使用转换器作为背景。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-28 15:02:13

据我所知,UWP xaml在风格上不支持这样的触发器。通常,我们在控件的根子节点上使用行为数据触发器。如果您不想使用数据绑定作为@touseefbsb的答案,但又想根据您的数据模型更改ComboboxItem样式,我认为您可以尝试操作组合框的Itemtemplate,并在其中使用行为数据触发器。

代码语言:javascript
复制
<ComboBox Width="300" Height="60" Name="MyComBoBox" ItemsSource="{Binding models}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <Grid Name="MyGrid">
                <TextBlock Text="{Binding Name}"></TextBlock>
                <interactivity:Interaction.Behaviors>
                    <core:DataTriggerBehavior Binding="{Binding IsValid}" ComparisonCondition="Equal" Value="true">
                        <core:ChangePropertyAction PropertyName="Background" TargetObject="{Binding ElementName=MyGrid}"
                                                   Value="{StaticResource MyColor}" />
                    </core:DataTriggerBehavior>
                </interactivity:Interaction.Behaviors>
            </Grid>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>
票数 1
EN

Stack Overflow用户

发布于 2018-09-27 06:59:54

这就是如何将集合绑定到uwp中的ComboBox,并使用集合项目的属性值设置每个项目的背景。

XAML

代码语言:javascript
复制
<ComboBox 
    x:Name="ComboBox1" 
    ItemsSource="{x:Bind Books}"
    Header="Select A Book">
    <ComboBox.ItemTemplate>
        <DataTemplate x:DataType="models:Book">
            <StackPanel  
                Background="{x:Bind MyBackground}"
                Padding="8">                        
                <TextBlock
                    Text="{x:Bind Title}"/>
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

C#

代码语言:javascript
复制
ObservableCollection<Book> Books = new ObservableCollection<Book>();

public MainPage()
{
    this.InitializeComponent();
    Books.Add(new Book("Book1",new SolidColorBrush(Colors.Red)));
    Books.Add(new Book("Book2",new SolidColorBrush(Colors.Green)));
    Books.Add(new Book("Book3",new SolidColorBrush(Colors.Blue)));
}

Models.Book

代码语言:javascript
复制
public class Book
{
    public string Title {get; set;}
    public SolidColorBrush MyBackground{get; set;}
    public Book(string title,SolidColorBrush myBackground)
    {
        Title = title;
        MyBackground = myBackground;
    }
}

因此,基本上你只需要绑定Stackpanel的background属性,在这个属性中你包装了ComboBoxItem的内容,你甚至可以将你的内容包装在网格或边框中,以及你喜欢的任何东西。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52527057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档