Silverlight 3中ItemContainerStyle中的数据绑定问题

时间:2009-07-24 09:39:12

标签: wpf silverlight data-binding listbox

我无法在ItemContainerStyle中为Silverlight 3中的ListBox使用数据绑定。它在WPF中运行正常。这是举例说明我的问题。我真正想要的是绑定到IsSelected属性,但我认为这个例子更容易理解。

我有一个ListBox绑定到ObservableCollection<Item>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应用程序将显示列表框中的项目,并根据Color对象的Item属性设置其背景颜色。但是,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上的属性绑定到项目的属性?

2 个答案:

答案 0 :(得分:5)

AFAIK Silverlight(甚至3)不支持样式设置器的绑定。你必须做一些自定义逻辑来改变每个项目加载时的背景颜色 - 可能是通过将其父项放在可视树中(可能是容器)并将其设置在那里。

答案 1 :(得分:0)

您的Item类不够完整,但Color是Brush类型而不是Color类型吗?由于您尝试设置的背景属性需要刷子。