Silverlight 3中ItemContainerStyle的数据绑定问题

3
我无法在Silverlight 3中使用数据绑定来绑定ListBox的ItemContainerStyle。在WPF中可以正常工作。这是一个人为制造的例子,以说明我的问题。我真正想做的是绑定到IsSelected属性,但我认为这个例子更容易理解。
我有一个ListBox,它绑定到一个ObservableCollection的Item对象:
public class Item {
  public String Name { get; }
  public Brush Color { get; }
}

以下是相关的Silverlight XAML代码:

<ListBox x:Name="listBox" ItemsSource="{Binding .}">
  <ListBox.ItemContainerStyle>
    <Style TargetType="ListBoxItem">
      <Setter Property="Background" Value="{Binding Color}"/>
    </Style>
  </ListBox.ItemContainerStyle>
  <ListBox.ItemTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding Name}"/>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

如果将TargetType="ListBoxItem"替换为TargetType="{x:Type ListBoxItem}",则可以在WPF中使用相同的XAML。
WPF应用程序将显示列表框中的项目,并根据Item对象的Color属性设置它们的背景颜色。然而,Silverlight应用程序会出现XamlParseException错误,文本为AG_E_RUNTIME_MANAGED_UNKNOWN_ERROR。作为一个固执的人,我甚至尝试删除失败的XAML,并创建了自己的样式,如下所示:
  Binding binding = new Binding("Color");
  Setter setter = new Setter(ListBoxItem.BackgroundProperty, binding);
  Style style = new Style(typeof(ListBoxItem));
  style.Setters.Add(setter);
  listBox.ItemContainerStyle = style;

在我的 Silverlight 控件初始化之后,如果我尝试运行它,就会出现 ArgumentException

我做错了什么?我该如何将 ItemContainerStyle 上的属性绑定到项的属性上?


与这个bug一样吗? http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=356496 - Aardvark
看起来是一样的,但它已经在一年多之前转交给了Silverlight团队,修复程序仍未被纳入Silverlight 3。 - Martin Liversage
liversage - 你曾找到一种好的方法来做这件事吗? - Simon_Weaver
2个回答

5
据我所知,Silverlight(包括3版本)不支持在样式设置器上使用绑定。您需要进行一些自定义逻辑来在每个项目加载时更改背景颜色 - 可能是通过获取其在可视树中的父级(即容器)并在那里进行设置来实现。

0

你的Item类还不够完善,但是Color是一个画刷类型而不是颜色类型对吧?因为你尝试设置的背景属性需要一个画刷。


抱歉,我忘记给Item的属性添加类型了。颜色属性的类型为Brush。我没有包含所有的代码,以免写出一堵墙的文字。不过,我有一个在WPF中可以正常工作,在Silverlight中失败的示例。 - Martin Liversage

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接