我正在尝试根据分配给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作为背景。
答案 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中