正如您看到的是,在UWP Style.Triggers
卡恩不会被使用,而且我明白你希望在xaml中完成这项工作,但是很抱歉地说现在没有这种纯粹的方式。
既然你只需要选择项目时改变StackPanel
的背景颜色,我想是不是需要改变了整个DataTemplate
,我在这里写的答案,介绍其采用Converter的数据的方法绑定和一点C#代码在这里,因为也许你对这种方法感兴趣。
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid.Resources>
<local:BoolToBrushConverter x:Key="cvt" />
</Grid.Resources>
<ListView x:Name="listview" ItemsSource="{x:Bind Collection, Mode=OneWay}"
SelectionChanged="listview_SelectionChanged">
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="40" />
</Grid.ColumnDefinitions>
<StackPanel Background="{Binding IsSelected, Converter={StaticResource cvt}}">
<TextBlock Text="{Binding Name}" />
</StackPanel>
<TextBlock Grid.Column="1" Text="{Binding Age}" />
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
后面的代码和数据模型:
private ObservableCollection<Model> Collection = new ObservableCollection<Model>();
protected override void OnNavigatedTo(NavigationEventArgs e)
{
for (int i = 0; i < 50; i++)
{
Collection.Add(new Model { Name = "Name " + i + ", ", Age = i });
}
}
private void listview_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
foreach (Model item in e.AddedItems)
{
item.IsSelected = true;
}
foreach (Model item in e.RemovedItems)
{
item.IsSelected = false;
}
}
public class Model : INotifyPropertyChanged
{
public string Name { get; set; }
public int Age { get; set; }
private bool _IsSelected;
public bool IsSelected
{
get { return _IsSelected; }
set
{
if (value != _IsSelected)
{
_IsSelected = value;
OnPropertyChanged();
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName]string propertyName = "")
{
if (this.PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
转换器:
public class BoolToBrushConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
bool? b = (bool?)value;
if (b == true)
return new SolidColorBrush(Colors.BlueViolet);
return new SolidColorBrush(Colors.Transparent);
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
如果你也感兴趣改变DataTemplate
,你可以参考我在另一种情况下的答案:UWP ListView: How to expand an item when select it?。
很多[网上资源](https://www.google.co.uk/search?q=xaml+listview+selected+item+style&oq=xaml+selecteditem+sty&aqs=chrome.1.69i57j0l5。 11897j0j7&sourceid = chrome&ie = UTF-8)关于如何完成该操作。 – Michael
@Michael是的,但似乎uwp xaml不支持样式中的触发器 – user2906881
道歉,并没有深入研究它是否适用于UWP。这就是说,我相信还有其他人面临[相同的限制](http://stackoverflow.com/a/31933556/997668)。 – Michael