【发布时间】:2010-11-13 16:20:46
【问题描述】:
我无法在 Silverlight 3 中为 ListBox 使用 ItemContainerStyle 中的数据绑定。它在 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 应用程序将显示列表框中的项目并根据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 上的属性绑定到项目的属性?
【问题讨论】:
-
看起来是一样的,但它在一年多前被转发给 Silverlight 团队,但修复程序仍然没有进入 Silverlight 3。
-
liversage - 你有没有找到这样做的好方法?
标签: wpf silverlight data-binding listbox