我不知道如何为我的XAML实现功能

<Window x:Class="WpfApplicationLAB.HighScore"
        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:WpfApplicationLAB"
        xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
        mc:Ignorable="d"
        Title="HighScore" Height="300" Width="300">
    <Window.Resources>
        <CollectionViewSource x:Key="SortedItems" Source="{Binding items}">
            <CollectionViewSource.SortDescriptions>
                <scm:SortDescription PropertyName="Result"/>
                <scm:SortDescription PropertyName="Name"/>
            </CollectionViewSource.SortDescriptions>
        </CollectionViewSource>
    </Window.Resources>

    <Grid>
        <ListView Margin="10" Name="lvDataBinding" ItemsSource ="{Binding items}" >
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <Setter Property="Height" Value="40" />
                </Style>
            </ListView.ItemContainerStyle>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <WrapPanel>
                        <TextBlock Text="{Binding Name}" FontWeight="Bold" />
                        <TextBlock Text="  " />
                        <TextBlock Text="{Binding Result}" FontWeight="Bold" />
                    </WrapPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

    </Grid>
</Window>


和C#

   public partial class HighScore : Window
    {
        public HighScore()
        {
            InitializeComponent();
            List<User> items = new List<User>();
            items.Add(new User() { Name = "John Doe", Result = 42 });
            items.Add(new User() { Name = "Jane Doe", Result = 39 });
            items.Add(new User() { Name = "Sammy Doe", Result = 13 });
        }
    }
    public class User
    {
        public string Name { get; set; }

        public int Result { get; set; }

        public override string ToString()
        {
            return this.Name + "   " + this.Result;
        }
    }
}


尝试实现CollectionView排序,但无法正常工作,我应该更改什么?

第二件事是我想替换背景颜色和字体颜色。我还尝试实现此示例的替代功能:Alternate background color in Listview XAML。但我不明白Property="ItemsControl.AlternationIndex" Value="0"并且

<DataTemplate DataType="system:String">
            <!-- put your data template here -->
</DataTemplate>


我应该如何实施呢?

最佳答案

从您的问题中还不清楚您到底在遇到什么困难。但是,您发布的代码在许多方面是错误的:


您无需设置数据上下文,也无需明确指定绑定源。
甚至没有任何要绑定的items属性。
您声明但不使用CollectionViewSource,因此在任何情况下均无效。


代码示例中也没有任何内容显示您尝试使用AlternationIndex的方式,因此无法说出您做错了什么。

综上所述,基本思想很简单。由于您找到了有关AlternationIndex的示例,因此我认为您在问题的CollectionViewSource部分中也这样做了,只是完全无法理解这些示例。我将在下面提供您的代码版本,以解决我上面提到的所有问题,并说明使用AlternationIndex产生输出中每行格式差异的一种可能方法:

XAML:

<Window x:Class="TestSO37246528SortAndAlternationIndex.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
        Title="MainWindow" Height="350" Width="525"
        Name="mainWindow">

  <Window.Resources>
    <CollectionViewSource x:Key="SortedItems" Source="{Binding items, ElementName=mainWindow}">
      <CollectionViewSource.SortDescriptions>
        <scm:SortDescription PropertyName="Result"/>
        <scm:SortDescription PropertyName="Name"/>
      </CollectionViewSource.SortDescriptions>
    </CollectionViewSource>
  </Window.Resources>

  <Grid>
    <ListView Margin="10" Name="lvDataBinding"
              ItemsSource ="{Binding Source={StaticResource SortedItems}}"
              AlternationCount="2">
      <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
          <Style.Triggers>
            <Trigger Property="ItemsControl.AlternationIndex" Value="1">
              <Setter Property="Background" Value="LightBlue"/>
            </Trigger>
          </Style.Triggers>
          <Setter Property="Height" Value="40" />
        </Style>
      </ListView.ItemContainerStyle>
      <ListView.ItemTemplate>
        <DataTemplate>
          <WrapPanel>
            <TextBlock Text="{Binding Name}" FontWeight="Bold" />
            <TextBlock Text="  " />
            <TextBlock Text="{Binding Result}" FontWeight="Bold" />
          </WrapPanel>
        </DataTemplate>
      </ListView.ItemTemplate>
    </ListView>
  </Grid>
</Window>


C#:

public partial class MainWindow : Window
{
    public List<User> items { get; private set; }

    public MainWindow()
    {
        items = new List<User>();
        items.Add(new User() { Name = "John Doe", Result = 42 });
        items.Add(new User() { Name = "Jane Doe", Result = 39 });
        items.Add(new User() { Name = "Sammy Doe", Result = 13 });
        InitializeComponent();
    }
}


User类与以前一样,因此我不必费心在这里包括它。

您会在上面注意到以下更改:


我给窗口命名,以便可以将其用作绑定源。
我将局部变量items从构造函数中移出并使其成为类中的一个属性。请注意,由于我什么都没有产生变更通知,因此设置属性并在InitializeComponent()方法之前填充列表内容也很重要。
我没有绑定到原始列表,而是使用CollectionViewSource作为绑定源进行绑定,从而确保ListView使用来自CollectionViewSource的视图。


请仔细将以上内容与原始代码进行比较,以便您了解每个特定问题的解决方式。如有任何疑问,请随时提问。请务必以清晰,精确的方式陈述您在理解上遇到的困难。

09-16 22:36