如何搜索wpf列表框项值并根据值突出显示索引?

时间:2016-03-24 16:31:50

标签: wpf listbox

在我的应用程序中,我希望您根据值突出显示索引。例如:

ArrayList itemsList = new ArrayList();
private void button_Click(object sender, RoutedEventArgs e)
{      
    itemsList.Add("Coffie");
    itemsList.Add("Tea");
    itemsList.Add("Orange Juice");
    itemsList.Add("Milk");
    itemsList.Add("Mango Shake");
    itemsList.Add("Iced Tea");
    itemsList.Add("Soda");
    itemsList.Add("Water");

    listBox.ItemsSource = itemsList;
    ApplyDataBinding();       
}

private void ApplyDataBinding()
{
    listBox.ItemsSource = null;
    listBox.ItemsSource = itemsList;
}

列表框中的位置无关紧要" Orange Juice"我想基于其价值来强调它。如果位置发生变化,它仍应突出显示。 (不基于所选索引)

2 个答案:

答案 0 :(得分:0)

如果要根据项目的值突出显示项目,则需要为项目定义自己的数据模板,并使用转换器为背景提供适当的画笔。这样的事情:

results

<Window.Resources>
    <local:TextToBrushConverter x:Key="TextToBrushConverter" />
</Window.Resources>
<Grid>
    <ListBox Name="listBox" HorizontalContentAlignment="Stretch">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding}" Background="{Binding ., Converter={StaticResource TextToBrushConverter}}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

转换器

class TextToBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if ((value as String) == "Orange Juice")
        {
            return Brushes.Orange;
        }

        return null;
    }

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

答案 1 :(得分:0)

我建议您将项目放入一个类,认为面向对象的设计,然后处理属性(作为标志)以给出不同的状态。

然后通过使用Xaml样式来关闭那些不同的属性以实现您正在寻找的效果。

比方说,我们有一个Order类,其中包含这些属性

public class Order
{
    public string CustomerName { get; set; }
    public int OrderId { get; set; }
    public bool InProgress { get; set; }
}

当订单被标记为正在进行时(InProgress = true),我们希望在列表框中显示红色,表示正在进行的“Alpha”和“Omega”:

enter image description here

ListBox Xaml

以下是绑定到我们数据的Xaml(绑定方式取决于您),并说明了如何使用Style(s),DataTemplateDataTrigger(s) )实现这一点:

<ListBox ItemsSource="{StaticResource Orders}"
         x:Name="lbOrders">
    <ListBox.Resources>
        <DataTemplate DataType="{x:Type model:Order}">
            <TextBlock Text="{Binding Path=CustomerName}" />
        </DataTemplate>
        <Style TargetType="{x:Type ListBoxItem}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=InProgress}"
                             Value="True">
                    <Setter Property="Foreground"
                            Value="Red" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ListBox.Resources>
</ListBox>

以下是页面资源Xaml中的数据设置,但它可以在后面的代码中创建:

<Window.Resources>
    <model:Orders x:Key="Orders">
        <model:Order CustomerName="Alpha"
                        OrderId="997"
                        InProgress="True" />
        <model:Order CustomerName="Beta"
                        OrderId="998"
                        InProgress="False" />
        <model:Order CustomerName="Omega"
                        OrderId="999"
                        InProgress="True" />
        <model:Order CustomerName="Zeta"
                        OrderId="1000"
                        InProgress="False" />
    </model:Orders>
</Window.Resources>

这应该足以让你开始创建一个功能齐全的用户界面。

相关问题