如何在UWP中将ComboBox ItemContainerStyle应用于DataTrigger?

时间:2018-09-26 22:52:39

标签: xaml uwp

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

我知道在WPF中可以通过以下方式实现:

 //tr[contains(@class, 'gridcell')]/td[contains(text(), 'Reissue ID Card')]

在UWP中,我尝试使用行为,但是仍然无法正常工作。

 <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>

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

   <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>

编辑:

我宁愿使用一种解决方案来设置ComboBoxItem本身的背景,而不是创建单独的网格/边框,然后使用Converters作为背景。

2 个答案:

答案 0 :(得分:1)

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

<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 :(得分:-1)

这是将集合绑定到uwp中的组合框,并使用集合项目的属性值设置每个项目的背景的方式。

XAML

<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#

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

public class Book
{
    public string Title {get; set;}
    public SolidColorBrush MyBackground{get; set;}
    public Book(string title,SolidColorBrush myBackground)
    {
        Title = title;
        MyBackground = myBackground;
    }
}

因此,基本上,您只需要绑定Stackpanel的背景属性,其中包裹了 ComboBoxItem 的内容,就可以将内容甚至包裹在Grid或Border中