另一種方法MultiBinding
:我傳遞集合作爲參數,查找前一個元素並檢查第一個字母是否匹配。
如果基礎集合是ObservableCollection<T>
和更改,則此方法更容易。由於顯示元素需要查找前一元素(O(n)),所以顯示元素也較慢,因此,顯示元素是O(n^2)。
在XAML:
<ListBox x:Name="lbExample" >
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Converter={StaticResource ResourceKey=first}}">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource prevComparerConverter}">
<Binding />
<Binding RelativeSource="{RelativeSource AncestorType={x:Type ListBox}}" Path="ItemsSource"/>
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<TextBlock Text="{Binding Converter={StaticResource ResourceKey=rest}}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
而在代碼:
public class PrevComparerConverter : IMultiValueConverter
{
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var item = (string)values[0];
var col = (ObservableCollection<string>)values[1];
var ind = col.IndexOf(item);
var res = true;
if (ind > 0 && item.Length > 0)
{
var prev = col[ind - 1];
if (prev.Length > 0 && char.ToLowerInvariant(prev[0]) == char.ToLowerInvariant(item[0]))
res = false;
}
return res;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
這種方法是比較容易,如果是一個簡單的方法來計算的 「錨」。例如。當數據沒有改變並且在附加的類或依賴屬性的幫助下。 – 2011-05-14 11:58:29