none
在Window.Resources中定义了ListBoxItem的有DataTrigger的Style,在ListBox中哪个属性可以引用这个Style? RRS feed

  • 问题

  • 各位专家:

            本人在学习WPF编程中的Style中的DataTrigger时,遇到下列问题。

            本人想实现的目的是:定义了一个Student类,里面有ID Age Name三个属性;定义了一个Student类的集合,该集合包含3个Student类实例。在ListBox显示出的这3个实例中,背景高亮显示出复合条件的那一条。

            目前的困惑是:

            对Style使用“批量引用”(即Style定义时没有 x:key)我实现了该功能。但当Style定义时有 x:key(如<Style TargetType="ListBoxItem"> x:key=“abc”)时,代码该如何修改,还请指点。

            以下为对Style使用“批量引用”(即没有Style定义时没有 x:key)时的完整代码:

            页面的完整XAML代码如下:

    <Window x:Class="WPF_Trigger_DataTrigger.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WPF_Trigger_DataTrigger"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <Style TargetType="ListBoxItem">
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate DataType="{x:Type local:Student}">
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="{Binding ID}" Width="60"/>
                                <TextBlock Text="{Binding Name}" Width="120"/>
                                <TextBlock Text="{Binding Age}" Width="60"/>
                            </StackPanel>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
                <Style.Triggers>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding Path=ID}" Value="2"/>
                            <Condition Binding="{Binding Path=Age}" Value="20"/>
                        </MultiDataTrigger.Conditions>
                        <MultiDataTrigger.Setters>
                            <Setter Property="Background" Value="Orange"/>
                        </MultiDataTrigger.Setters>
                    </MultiDataTrigger>
                </Style.Triggers>
            </Style>
        </Window.Resources>
        <Grid >
            <Button x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="379,263,0,0" VerticalAlignment="Top" Width="75" Click="button_Click"/>
            <!--下方ListBox该如何设定??-->
            <ListBox x:Name="listBox" HorizontalAlignment="Left" Height="125" Margin="269,71,0,0" VerticalAlignment="Top" Width="185"/>
        </Grid>
    </Window>

            该页面的代码隐藏文件中完整c#如下:

    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;//使用ObservableCollection<T>必须引用
    using System.Globalization;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    namespace WPF_Trigger_DataTrigger
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            StudentList slt;
            public MainWindow()
            {
                InitializeComponent();
    
                slt = new StudentList();
                listBox.ItemsSource = slt;
            }
    
            private void button_Click(object sender, RoutedEventArgs e)
            {
                Student st = new Student();
                st.Age = 10;
                st.ID = 1;
                st.Name = "A";
    
                /*--如何在ObservableCollection<T>中添加项目-----*/
                slt.Add(new Student() { ID = 2, Name = "B", Age = 20 });
                slt.Add(new Student() { ID = 3, Name = "C", Age = 30 });
                slt.Add(st);
            }
        }
        
        public class StudentList : ObservableCollection<Student>
        { }
        public class Student
        {
            public int ID { get; set; }
            public string Name { get; set; }
            public int Age { get; set; }
        }
    }



    • 已编辑 wxysy 2016年2月27日 16:15 打错了字
    2016年2月27日 16:09

答案

  • <ListBox x:Name="listBox" ItemContainerStyle="{StaticResource abc}" ...

    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    2016年2月29日 1:21
    版主

全部回复

  • <ListBox x:Name="listBox" ItemContainerStyle="{StaticResource abc}" ...

    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    2016年2月29日 1:21
    版主
  • 版主的回答一针见血,赞一个!!!

    谢谢版主Bob_Bao


    2016年3月2日 11:25