2016-05-16 6 views
2

Я не знаю, как реализовать функции моего XAMLСортировка и чередуя ListView

<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> 

Как мне это реализовать?

+0

Пожалуйста, будьте более конкретными, чем «это не работает». Код, который вы опубликовали, не выглядит действительным: нет контекста данных или ничего с атрибутом 'items' для привязки, и вы, похоже, не используете' CollectionViewSource'. Что _exactly_ делает код, когда вы его запускаете, и как _exactly_ отличается от того, что вы хотите? Что касается вопроса «AlternationIndex», вы должны отправить новый вопрос с помощью [mcve], который показывает, как вы пытались его использовать, а также описание _precise_ того, что делает этот код, и как это отличается от того, что вы хотите. –

ответ

0

На ваш вопрос не совсем ясно, с чем конкретно вы столкнулись. Однако код, который вы опубликовали, неверен несколькими способами:

  1. Вы не устанавливаете контекст данных и не указываете источники привязки явно.
  2. Существует ничего, что даже имеетitems property to bind to.
  3. Вы заявляете, но не используете, CollectionViewSource, поэтому он не будет иметь никакого эффекта в любом случае.

В примере кода также нет ничего, что показывало бы, как вы пытались использовать AlternationIndex, поэтому невозможно сказать, что вы сделали неправильно.

Все, что сказано, основные идеи достаточно просты. Поскольку вы нашли пример относительно AlternationIndex, я согласен с тем, что вы также сделали это для части вашего вопроса и просто не смогли понять эти примеры. Я в том числе ниже версии вашего кода, который адресует все вопросы, которые я упомянул выше, а также показывает один из возможных способов использования 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 класс, как и раньше, так что я не удосужился включить это здесь.

Вы отметите в вышеуказанном следующие изменения:

  1. Я дал окно имя, так что я мог бы использовать его в качестве обязательного источника.
  2. Я переместил локальную переменную items из конструктора и сделал ее собственностью в классе. Обратите внимание, что поскольку я ничего не делал для получения уведомлений об изменениях, важно также, чтобы свойство было установлено, а содержимое списка заполнено до InitializeComponent().
  3. Вместо привязки к исходному списку я связываю с использованием CollectionViewSource в качестве источника связывания, тем самым гарантируя, что ListView использует вид из CollectionViewSource.

Пожалуйста, тщательно сравните вышеуказанное с вашим исходным кодом, чтобы вы могли понять, как были исправлены каждая из конкретных проблем. Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь спрашивать. Обязательно укажите четкие, точные слова, что конкретно у вас возникли проблемы с пониманием.

+0

Okey, я понимаю больше, но почему-то он пока не показывает результаты в окне. Я копирую ваш код, чтобы быть уверенным, что я не ошибся и все еще нет ни одного человека в списке. – Vinci

+0

Okey! нашел простой вопрос, СПАСИБО! :) Мне нужно много времени и раскошелиться, и вы сделали это так быстро! :) – Vinci

Смежные вопросы