2016-10-18 55 views
0

在UWP Xaml中,我有一个ListView。在ListView我使用一个DataTemplate用栈面板, 我想改变的StackPanel的backgrund颜色,当selectedItem属性为True 我也想这样做,在XAML如果在UWP中选择,更改ListBox项的DataTemplate

的。换句话说,

变化DataTemplate中的ListView项如果选择 我也想这样做,在XAML

代码在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

很多[网上资源](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

+0

@Michael是的,但似乎uwp xaml不支持样式中的触发器 – user2906881

+1

道歉,并没有深入研究它是否适用于UWP。这就是说,我相信还有其他人面临[相同的限制](http://stackoverflow.com/a/31933556/997668)。 – Michael

回答

2

正如您看到的是,在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?

相关问题