我无法在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
上的属性绑定到项目的属性?
答案 0 :(得分:5)
AFAIK Silverlight(甚至3)不支持样式设置器的绑定。你必须做一些自定义逻辑来改变每个项目加载时的背景颜色 - 可能是通过将其父项放在可视树中(可能是容器)并将其设置在那里。
答案 1 :(得分:0)
您的Item类不够完整,但Color是Brush类型而不是Color类型吗?由于您尝试设置的背景属性需要刷子。