2016-10-18 5 views
0

In UWP Xaml habe ich eine ListView. In der Listview-i ein Datatemplate mit einem Stapel Panel verwenden, wollen ich grund Farbe Stackpanel ändern, wenn selectedItem Wahr ist ich esDataTemplate für ListBox-Element ändern, wenn in UWP ausgewählt

die anderen Wörter in XAML tun wollen,

ändern Datatemplate für Listview-Element wenn ausgewählt ich will es in XAML tun

Code in XAML:

<ListView.ItemTemplate > 
    <DataTemplate x:Name="mydt"> 

     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="*" /> 
       <ColumnDefinition Width="40" /> 
      </Grid.ColumnDefinitions> 
      <StackPanel x:Name="MyStack"> 
       <ContentControl Content="{Binding rtb}" 
           q:APGolAyah.MyProperty="{Binding AyahNo}" />       
       <TextBlock Text="{Binding Text}" 
          TextWrapping="Wrap" /> 

      </StackPanel> 
      <Image Grid.Column="1" 
        Source="{Binding HezbNo,Converter={StaticResource HezbNoToIconConverter}}" 
        Width="25" /> 
     </Grid> 
    </DataTemplate> 
</ListView.ItemTemplate> 
+0

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

+0

@Michael ja aber es scheint, dass UWP XAML nicht unterstützt Trigger in Stilen – user2906881

+1

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

Antwort

2

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

Verwandte Themen