2016-10-17 12 views
1

私の問題/アイデアの解決策を見つけることができず、誰かが私を助けてくれることを願っています。 WPFではIEnumerable<Item>に応じてCollectionViewSourceがあります。 Itemは、の名前,高さ,年齢フィールドを持ちます。 Xamlでは、ListViewのItemsSource="{Binding CollectionViewSource.View}"です。WPFリストビュー交互の行の背景データグループではない行

私が知っている通り、Listviewには、行の背景色を変更できるAlternationCountプロパティがあります。

しかし、私は年齢フィールドデータは、上記の行の年齢データと異なる場合にのみ、行の背景色を変更したいです。 年齢データが異なる場合にのみ、行の背景色を交互さ

alternate

年齢によって順序付けこのよう

、。

リストに別のソート順を設定すると、交互に変更する必要があります。

この写真ではリストは名前によって注文された:

Alternate color order name

しかし、背景色が年齢データに依存します。

このコンセプトの解決方法はありますか?

+1

うーん...私の最初の試みは、背景をバインドするだろうitemSourceとItemをMultiValueConverterに渡してアイテムのインデックスを取得し、次にチェックすることができますインデックス - 1 – SledgeHammer

答えて

0

を実行し、このライブの生活最大限に:

XAML:

<Window x:Class="WpfStackOverflow.Window6" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window6" Height="362.03" Width="563.91"> 

<Window.Resources> 
    <CollectionViewSource x:Key="CVS" Source="{Binding .}"> 
     <CollectionViewSource.GroupDescriptions> 
      <PropertyGroupDescription PropertyName="Age"/> 
     </CollectionViewSource.GroupDescriptions> 
    </CollectionViewSource> 
</Window.Resources> 

<Grid> 
    <ListView x:Name="LstView" ItemsSource="{Binding Source={StaticResource CVS}}"> 
     <ListView.Resources> 
      <AlternationConverter x:Key="AltCnvKey"> 
       <SolidColorBrush Color="Snow"/> 
       <SolidColorBrush Color="LightBlue"/> 
       <SolidColorBrush Color="Orange"/> 
      </AlternationConverter> 
     </ListView.Resources> 
     <ListView.View> 
      <GridView> 
       <GridView.Columns> 
        <GridViewColumn DisplayMemberBinding="{Binding Name}" Header="Name"/> 
        <GridViewColumn DisplayMemberBinding="{Binding Height}" Header="Height"/> 
        <GridViewColumn DisplayMemberBinding="{Binding Age}" Header="Age"/> 
       </GridView.Columns> 
      </GridView> 
     </ListView.View>   
     <ListView.GroupStyle> 
      <GroupStyle AlternationCount="3">      
       <GroupStyle.ContainerStyle> 
        <Style TargetType="GroupItem"> 
         <Setter Property="Template"> 
          <Setter.Value> 
           <ControlTemplate TargetType="GroupItem"> 
            <StackPanel Orientation="Horizontal"> 
             <StackPanel.Resources> 
              <Style TargetType="StackPanel"> 
               <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource AncestorType=GroupItem, Mode=FindAncestor}, Path=(ItemsControl.AlternationIndex), Converter={StaticResource AltCnvKey}}"/> 
              </Style> 
             </StackPanel.Resources> 
             <ItemsPresenter/> 
            </StackPanel> 
           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
        </Style> 
       </GroupStyle.ContainerStyle> 
      </GroupStyle> 
     </ListView.GroupStyle> 
    </ListView> 
</Grid> 

コード:

using System.Linq; 
using System.Windows; 

namespace WpfStackOverflow 
{ 
    /// <summary> 
    /// Interaction logic for Window6.xaml 
    /// </summary> 
    public partial class Window6 : Window 
    { 
     public Window6() 
     { 
      InitializeComponent(); 

      this.DataContext = new[] { new { Age = 32, Name = "Name1", Height = 6 }, new { Age = 34, Name = "Name1", Height = 6 }, new { Age = 34, Name = "Name1", Height = 6 }, new { Age = 32, Name = "Name1", Height = 6 }, new { Age = 32, Name = "Name1", Height = 6 }, new { Age = 39, Name = "Name1", Height = 6 }, new { Age = 40, Name = "Name1", Height = 6 } }.ToList(); 
     } 
    } 
} 
+0

こんにちは!私もこれを試しましたが、私のソリューションには実装できませんでした。なぜ、MVVMかも知れません。 ありがとうございます。 – HegeGabi

+0

@HegeGabi lol haha​​ha – AnjumSKhan

+0

@HegeGabi私の答えは、WPF自体が提供する標準的な機能を使用しており、余分なロジックは使用していません。 – AnjumSKhan

0

あなたの仕事にRelativeSource.PreviousDataを使うことができます。

まず、あなたがそれらに基づいて、現在の交代指数を比較して返したい値を受け入れるIMultivalueConverterを作成します。

class ComparisonConverter : IMultiValueConverter 
{ 
    private int currentAlternation = 0; 
    public int AlternationCount { get; set; } = 2; 

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     // TODO: exception handling 
     if (values.Distinct().Count() != 1) 
     { 
      if (++currentAlternation >= AlternationCount) 
      { 
       currentAlternation = 0; 
      } 
     } 

     return currentAlternation; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

このコンバータは、複数の値を受け入れ、すべての値があるときそのまま交代インデックスを返します。等しい;それ以外の場合は、最初に代替索引を次の索引に変更してから、新しい索引を戻します。今

、あなたの色を定義するStyleに交代インデックス値を提供しますMultiBindingを作成します。

<!-- This is an incomplete ListView! Set the View and ItemsSource as required. --> 
<ListView> 
    <ListView.Resources> 
     <local:ComparisonConverter x:Key="ComparisonConverter"/> 
    </ListView.Resources> 
    <ListView.ItemContainerStyle> 
     <Style TargetType="ListViewItem"> 
      <Style.Triggers> 
       <!-- This is the DataTrigger for the alternation index 1 --> 
       <DataTrigger Value="1"> 
        <DataTrigger.Binding> 
         <MultiBinding Converter="{StaticResource ComparisonConverter}"> 
          <Binding Path="Age"/> 
          <Binding Path="Age" RelativeSource="{RelativeSource PreviousData}"/> 
         </MultiBinding> 
        </DataTrigger.Binding> 
        <Setter Property="Background" Value="Red"/> 
       </DataTrigger> 
      </Style.Triggers> 
      <Setter Property="Background" Value="Wheat"/> 
     </Style> 
    </ListView.ItemContainerStyle> 
</ListView> 

ので、このスタイルでは、交代インデックス0のデフォルトの色は小麦です。 DataTriggerを使用すると、交番インデックス1は赤色を生成します。

CollectionViewSourceがビューを再構築するので、ソート順の変更は自動的に反映されるため、ListViewは各アイテムのMultiBindingを使用してゼロからすべてのアイテムを作成します。

+0

こんにちは! 私もこれを試しましたが、私は私のソリューションに実装できませんでした。なぜ、MVVMかも知れません。 – HegeGabi

+0

申し訳ありませんが、私は台無しにしました。 私はこれを使い、とてもうまく動作します。 – HegeGabi

+0

さらにもう1つの質問。 DoFocusでMVVMをListに使用しています。リストがフォーカスを取り戻すたびに、バックグラウンドカラー化が再実行されます。 ItemsSourceリストが変更されたときにのみ行の色が実行されるようにするにはどうすればよいですか?リストにアイテムを追加または削除しますか? – HegeGabi

関連する問題