【问题标题】:Change DataTemplate for ListBox item if selected in UWP如果在 UWP 中选中,则更改 ListBox 项的 DataTemplate
【发布时间】:2017-02-27 12:46:11
【问题描述】:

在 UWP Xaml 中,我有一个 ListView。在 ListView 中,我使用带有堆栈面板的 DataTemplate, 当 selectedItem 为 True 时,我想更改堆栈面板的背景颜色 我确实想在 Xaml 中做这件事

换句话说,

如果选中,则更改 Listview 项目的 DataTemplate 我确实想在 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>

【问题讨论】:

  • 很多resources on the net关于如何实现这一点。
  • @Michael 是的,但似乎 uwp xaml 不支持样式中的触发器
  • 抱歉,没有彻底调查这是否适用于 UWP。话虽如此,我相信还有其他人面对the same limitation
  • 您可以通过重新设置列表样式并更改选择颜色来做到这一点。或者您可以使用转换器在数据模板级别执行此操作。

标签: c# windows-10-universal uwp-xaml


【解决方案1】:

正如您发现在 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?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 2021-10-03
    • 2019-12-23
    • 1970-01-01
    • 2017-02-27
    • 2016-03-03
    相关资源
    最近更新 更多