0

我对 WPF 很陌生,所以这可能是一个简单的问题。

我有具有已定义样式、字体和其余所有内容的 ListBox。我想在那里突出显示一行,但问题是所有行都是以编程方式添加的,所以我不能只编辑行属性并更改例如前景颜色(这就足够了)。我知道目标行 ID,但我找不到任何方法来访问它的 ListItemBox 对象。要访问我使用的特定项目:

((MyClass)(Playlist.Items[i])).MyProperty = 0; //Access the i element of ListBox named Playlist

甚至可能吗?我在这里和其他网站上搜索了解决方案,但对我来说没有任何帮助。

谢谢你的帮助。

编辑:我不是要选择行,而是要更改它的前景色。

4

3 回答 3

2

您可以使用 DataTemplate 和 DataTrigger。您的 DataTemplate 定义了您希望列表框中的每个项目看起来像什么(TextBlock、Image 等)。DataTrigger 将标记列表框中每个项目的特定数据条件,并相应地更改 DataTemplate 的样式(如前景色)。这是假设您的 ListBox 数据绑定到具有名为 MyProperty 的属性的 MyClass 集合。

<DataTemplate>
    <TextBlock Text="{Binding MyProperty}"/>
<DataTemplate.Triggers>
    <DataTrigger Binding="{Binding Path=ID}">
        <DataTrigger.Value>
            303216
        </DataTrigger.Value>
      <DataTrigger.Setters>
        <Setter Property="Foreground" Value="Navy"/>
      </DataTrigger.Setters>
    </DataTrigger>
</DataTemplate.Triggers>

</DataTemplate>

http://msdn.microsoft.com/en-us/library/system.windows.datatemplate.triggers.aspx

于 2013-06-11T18:50:12.127 回答
0

如果您无法为此实施适当的 MVVM 解决方案,您可以ListBoxItemItems. ListBox如果ListBox是数据绑定(使用ItemsSource属性),ListBoxItem则自动生成的每个 s 都将其DataContext属性设置为集合中绑定到该ItemsSource属性的项。你可以在那里评估它。但是,我不推荐这种方法。如果可能,请使用适当的 MVVM 解决方案。

var id = ...;

var item = (from ListBoxItem i in ListBox1.Items
            let data = (MyClass) i.DataContext
            where data.Id == id
            select i).FirstOrDefault();
if (item != null)
    item.Foreground = Brushes.Red;
于 2013-06-11T19:21:40.743 回答
0

设计 SCRATCH 中使用 Blend 的列表框控件模板将帮助您更改列表框中所选项目的前景色。Blend 也是 WPF UI 设计的绝佳工具,所以请检查一下。

于 2013-06-11T18:42:13.387 回答