كيفية القيام بما يلي: تبديل لون الخلفية للصفوف في ListView
يوضح هذا المثال ثلاث طرق يمكنك استخدام البديلة Background الألوان من أجل عمود في ListView.
مثال
توفر المقاطع التالية ثلاث طرق لإنشاء ListView مع الصفوف البديلة في Background اللون. تتناول المثال أيضًا أسلوب تحديث طريقة العرض عند إضافة أو إزالة الصفوف.
الطريقة الأولى: تعريف أنماط التي تستخدم IValueConverter إلى بديل اللون الخلفية
يظهر المثال التالي كيف يتم تعريف Style للحصول ListViewItem التحكم يربط القيمة Background الخاصية إلى IValueConverter.
<Style x:Key="myItemStyle" TargetType="{x:Type ListViewItem}">
<Setter Property="Background">
<Setter.Value>
<Binding RelativeSource="{RelativeSource Self}"
Converter="{StaticResource myConverter}"/>
</Setter.Value>
</Setter>
</Style>
يعرّف المثال التالي ResourceKey لـ IValueConverter.
<namespc:BackgroundConverter x:Key="myConverter"/>
يظهر المثال التالي التعريف IValueConverter الذي يعين Background الخاصية استناداً إلى فهرس الصف.
Public NotInheritable Class BackgroundConverter
Implements IValueConverter
Public Function Convert(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As CultureInfo) As Object Implements IValueConverter.Convert
Dim item As ListViewItem = CType(value, ListViewItem)
Dim listView As ListView = TryCast(ItemsControl.ItemsControlFromItemContainer(item), ListView)
' Get the index of a ListViewItem
Dim index As Integer = listView.ItemContainerGenerator.IndexFromContainer(item)
If index Mod 2 = 0 Then
Return Brushes.LightBlue
Else
Return Brushes.Beige
End If
End Function
public sealed class BackgroundConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter,
CultureInfo culture)
{
ListViewItem item = (ListViewItem)value;
ListView listView =
ItemsControl.ItemsControlFromItemContainer(item) as ListView;
// Get the index of a ListViewItem
int index =
listView.ItemContainerGenerator.IndexFromContainer(item);
if (index % 2 == 0)
{
return Brushes.LightBlue;
}
else
{
return Brushes.Beige;
}
}
المثال التالي كيفية تعريف ListView يستخدم Style كـ به ItemContainerStyle بمن أجل توفير التخطيط المطلوب.
<ListView Name="theListView"
ItemsSource="{Binding Source={StaticResource EmployeeData},
XPath=Employee}"
ItemContainerStyle="{StaticResource myItemStyle}" >
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding XPath=FirstName}"
Header="First Name" Width="120"/>
<GridViewColumn DisplayMemberBinding="{Binding XPath=LastName}"
Header="Last Name" Width="120"/>
<GridViewColumn DisplayMemberBinding="{Binding XPath=FavoriteCity}"
Header="Favorite City" Width="120"/>
</GridView>
</ListView.View>
</ListView>
الطريقة الثانية: ينحدر فئة جديدة من عرض قائمة إلى بديل خلفية اللون
المثال التالي كيفية تعريف فئة مشتقة من ListView. يتجاوز هذه الفئة PrepareContainerForItemOverride الأسلوب في ترتيب لإنشاء الصفوف التي تحتوي على المتبادلة Background الألوان.
Public Class SubListView
Inherits ListView
Protected Overrides Sub PrepareContainerForItemOverride(ByVal element As DependencyObject, ByVal item As Object)
MyBase.PrepareContainerForItemOverride(element, item)
If TypeOf View Is GridView Then
Dim index As Integer = ItemContainerGenerator.IndexFromContainer(element)
Dim lvi As ListViewItem = TryCast(element, ListViewItem)
If index Mod 2 = 0 Then
lvi.Background = Brushes.LightBlue
Else
lvi.Background = Brushes.Beige
End If
End If
End Sub
End Class
public class SubListView : ListView
{
protected override void
PrepareContainerForItemOverride(DependencyObject element,
object item)
{
base.PrepareContainerForItemOverride(element, item);
if (View is GridView)
{
int index = ItemContainerGenerator.IndexFromContainer(element);
ListViewItem lvi = element as ListViewItem;
if (index % 2 == 0)
{
lvi.Background = Brushes.LightBlue;
}
else
{
lvi.Background = Brushes.Beige;
}
}
}
}
يوضح المثال التالي كيفية إنشاء مثيل من واستخدامها. namespc البادئة مخططات الى وقت تشغيل اللغة العامة (CLR) مساحة الاسم و التجميع المطابق حيث StyleSelector معرّفًا.
<namespc:SubListView
ItemsSource="{Binding Source={StaticResource EmployeeData},
XPath=Employee}">
<namespc:SubListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding XPath=FirstName}"
Header="First Name" Width="120"/>
<GridViewColumn DisplayMemberBinding="{Binding XPath=LastName}"
Header="Last Name" Width="120"/>
<GridViewColumn DisplayMemberBinding="{Binding XPath=FavoriteCity}"
Header="Favorite City" Width="120"/>
</GridView>
</namespc:SubListView.View>
</namespc:SubListView>
الطريقة الثالثة: استخدام StyleSelector لمتعاقبة اللون الخلفية
المثال التالي كيفية تعريف StyleSelector الذي يعرف Style الصف. يحدد هذا المثال Background طبقًال لون فهرس الصف.
Public Class ListViewItemStyleSelector
Inherits StyleSelector
Public Overrides Function SelectStyle(ByVal item As Object, ByVal container As DependencyObject) As Style
Dim st As New Style()
st.TargetType = GetType(ListViewItem)
Dim backGroundSetter As New Setter()
backGroundSetter.Property = ListViewItem.BackgroundProperty
Dim listView As ListView = TryCast(ItemsControl.ItemsControlFromItemContainer(container), ListView)
Dim index As Integer = listView.ItemContainerGenerator.IndexFromContainer(container)
If index Mod 2 = 0 Then
backGroundSetter.Value = Brushes.LightBlue
Else
backGroundSetter.Value = Brushes.Beige
End If
st.Setters.Add(backGroundSetter)
Return st
End Function
End Class
public class ListViewItemStyleSelector : StyleSelector
{
public override Style SelectStyle(object item,
DependencyObject container)
{
Style st = new Style();
st.TargetType = typeof(ListViewItem);
Setter backGroundSetter = new Setter();
backGroundSetter.Property = ListViewItem.BackgroundProperty;
ListView listView =
ItemsControl.ItemsControlFromItemContainer(container)
as ListView;
int index =
listView.ItemContainerGenerator.IndexFromContainer(container);
if (index % 2 == 0)
{
backGroundSetter.Value = Brushes.LightBlue;
}
else
{
backGroundSetter.Value = Brushes.Beige;
}
st.Setters.Add(backGroundSetter);
return st;
}
}
المثال التالي كيفية تعريف ResourceKey للحصول StyleSelector. namespc البادئة مخططات الى CLR مساحة الاسم و التجميع المطابق حيث StyleSelector معرّفًا. لمزيد من المعلومات، راجع مساحات الاسم XAML وتعيين مساحة الاسم ل XAML WPF.
<namespc:ListViewItemStyleSelector x:Key="myStyleSelector"/>
يُظهر المثال التالي كيفية تعيين خاصية ItemContainerStyleSelector التابعة لـListView إلى المورد StyleSelector.
<ListView
ItemsSource="{Binding Source={StaticResource EmployeeData},
XPath=Employee}"
ItemContainerStyleSelector="{DynamicResource myStyleSelector}" >
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding XPath=FirstName}"
Header="First Name" Width="120"/>
<GridViewColumn DisplayMemberBinding="{Binding XPath=LastName}"
Header="Last Name" Width="120"/>
<GridViewColumn DisplayMemberBinding="{Binding XPath=FavoriteCity}"
Header="Favorite City" Width="120"/>
</GridView>
</ListView.View>
</ListView>
تحديث ListView بعد تغيير في مجموعة ListViewItem
في حالة إضافة أو إزالة ListViewItem من ListView عنصر التحكم، يجب عليك تحديث ListViewItem عناصر التحكم في ترتيب لإعادة التبديل في Background اللون. المثال التالي كيفية تحديث ListViewItem عناصر التحكم.
Dim dataView As ICollectionView = CollectionViewSource.GetDefaultView(theListView.ItemsSource)
dataView.Refresh()
ICollectionView dataView =
CollectionViewSource.GetDefaultView(theListView.ItemsSource);
dataView.Refresh();