我不知道如何为我的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
的视图。请仔细将以上内容与原始代码进行比较,以便您了解每个特定问题的解决方式。如有任何疑问,请随时提问。请务必以清晰,精确的方式陈述您在理解上遇到的困难。