Wie Sie gefunden haben, dass in UWP Style.Triggers
Cann ot verwendet werden, und ich verstehe, dass Sie diese Arbeit rein in XAML tun wollen, aber es tut mir leid zu sagen, dass es keinen solchen reinen Weg jetzt gibt.
Da Sie nur die Hintergrundfarbe des StackPanel
ändern möchten, wenn das Element ausgewählt ist, ich denke, es ist nicht die ganze DataTemplate
geändert erforderlich ist, schreibe ich das hier Antwort ein Verfahren einzuführen, die Converter für Daten verwendet, Binding und ein bisschen C# -Code hier, da Sie vielleicht Interesse an dieser Methode haben.
<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>
-Code hinter und Datenmodell:
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));
}
}
}
Converter:
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();
}
}
Und wenn Sie auch Interesse DataTemplate
in wechselnden, können Sie auf meine Antwort in einem anderen Fall verweisen: UWP ListView: How to expand an item when select it?.
Eine Menge [Ressourcen im Internet] (https://www.google.de/search?q=xaml+listview+selected+item+style&oq=xaml+selecteditem+sty&aqs=chrome.1.69i57j0l5. 11897j0j7 & sourceid = chrome & ie = UTF-8), wie dies zu erreichen ist. – Michael
@Michael ja aber es scheint, dass UWP XAML nicht unterstützt Trigger in Stilen – user2906881
Entschuldigung, nicht gründlich untersucht, dass dies für UWP gilt. Davon abgesehen glaube ich, dass es andere gibt, die [die gleiche Einschränkung] haben (http://stackoverflow.com/a/31933556/997668). – Michael