如何突出显示符合特定条件的ListBox项

时间:2015-11-11 12:08:42

标签: c# wpf xaml data-binding

我有2个ListBoxes因此定义:

        <ListBox Name="aggregatesListBox" SelectionChanged="aggregatesList_SelectionChanged">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Path=Amount}"/>
                        <TextBlock Text="{Binding Path=AccountId}"/>
                        <TextBlock Text="{Binding Path=Name}"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

        <ListBox Name="postingsListBox" >
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Path=PostingId}" />
                        <TextBlock Text="{Binding Path=Amount}" />
                        <TextBlock Text="{Binding Path=CreatedDate}" />
                        <TextBlock Text="{Binding Path=AccountId}" />
                        <TextBlock Text="{Binding Path=Name}" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox> 

我希望发布列表中的所有项目都突出显示(在某种程度上,最好是背景颜色),如果它们与当前选定的聚合项目共享相同的帐户ID。

我有什么选择?

根据给出的建议,我修改如下

       <ListBox Name="postingsListBox" >
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">

                        <StackPanel.Resources>
                            <local:IdToBrushConverter x:Key="IdToBrushConverter" />
                        </StackPanel.Resources>

                        <StackPanel.Background>
                            <MultiBinding Converter="{StaticResource IdToBrushConverter}">
                                <Binding ElementName="aggregatesListBox" Path="SelectedItem.AccountId"/>
                                <Binding Path="AccountId"/>
                            </MultiBinding>
                        </StackPanel.Background>

                        <TextBlock Text="{Binding Path=PostingId}"  /> 
                        <TextBlock Text="{Binding Path=Amount}"     />
                        <TextBlock Text="{Binding Path=CreatedDate}"/>
                        <TextBlock Text="{Binding Path=AccountId}"  />
                        <TextBlock Text="{Binding Path=Name}"       />

                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

    public class IdToBrushConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        System.Windows.Media.Color colour;

        if (values[0] == DependencyProperty.UnsetValue || values[1] == DependencyProperty.UnsetValue || ((int)values[0] != (int)values[1]))
            colour = System.Windows.Media.Colors.White;
        else
            colour = System.Windows.Media.Colors.CornflowerBlue;

        return new SolidColorBrush(colour);
    }

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

窗口上的属性是必需的,以便可以找到画笔转换器

xmlns:local="clr-namespace:MyAccountingThing"

我还改变了幕后逻辑,使用对象列表作为2个列表框中每个列表框的ItemsSource而不是之前的DataRowView

排序 - 谢谢!

1 个答案:

答案 0 :(得分:1)

你可以使用带转换器的多重绑定,这是一个例子。

<强> XAML

<ListBox x:Name="list1"
             ItemsSource="{Binding List1}">
    </ListBox>

    <ListBox x:Name="list2"
             ItemsSource="{Binding List2}"
             Grid.Column="2">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding .}">
                        <TextBlock.Background>
                            <MultiBinding Converter="{StaticResource converter}">
                                <Binding Path="SelectedItem" ElementName="list1"/>
                                <Binding Path="."/>
                            </MultiBinding>
                        </TextBlock.Background>
                    </TextBlock>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

在我的愚蠢示例中,我使用MultiBiding能够将多个参数传递给Converter,这是list1上的selectedItem和ListBox2正在应用模板的currentItem,接下来,我使用转换器进行比较收到的值:

<强>转换器:

public class Converter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var selectedValueList1 = values[0];
        var currentItemList2 = values[1];

        if(selectedValueList1 == null) // Listbox 1 has no selected Item
            return Brushes.Black;

        if (selectedValueList1 == currentItemList2)
            return Brushes.Red;

        return Brushes.Transparent;
    }

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

当然,你必须更好地对你的转换器进行测试,在我的例子中,我只传递两个字符串进行比较。

就是这样,它就像预期的那样工作。

enter image description here