我的问题使用以下代码,绑定IsAvailable
类的MyListBoxItem
属性。我目前的解决方案:
<ListBox ItemTemplate="{StaticResource myTemplate}">
<ListBox.Resources>
<DataTemplate x:Key="myTemplate" DataType="{x:Type local:MyListBoxItem}">
<Label Foreground="Green" Content="{Binding Title}" Tag="{Binding IsAvailable}">
<Label.Style>
<Style TargetType="{x:Type Label}">
<Style.Triggers>
<DataTrigger Binding="{Binding Tag, RelativeSource={RelativeSource Self}}" Value="True">
<Setter Property="FontWeight" Value="Bold"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Label.Style>
</Label>
</DataTemplate>
... (more datatemplates)
</ListBox.Resources>
</ListBox>
我的问题:在我的解决方案中,IsAvailable
的值经历了“两个绑定”。第一个将值绑定到Tag
的{{1}}属性,然后在样式触发器中,触发器检查其值并设置Label
的属性。当我使用Label
时它不起作用,因为Binding="{Binding IsAvailable, RelativeSource={RelativeSource AncestorType={x:Type local:MyListBoxItem}}}"
无法看到Style
的任何祖先(或类似的原因),导致绑定错误(使用代码4或40个或许),对于添加到Label
的每个项目。
最后:我可以使解决方案更简单,或者没有其他(更好)解决方案吗?
我忘了提到一件重要的事情,抱歉:我将ListBox
放在ListBox的资源中,因为我有更多模板(它们基本上不同,所以我不能用触发器来设置它们,我必须在它之间切换......
答案 0 :(得分:0)
ItemTemplate
将采用ItemsSource
绑定的类型。因此,您应该能够简单地绑定到IsAvailable
,因为ListBox的项类型是MyListBoxItem
。试试这个:
<ListBox ItemsSource="...">
<ListBox.ItemTemplate>
<DataTemplate>
<Label Foreground="Green" Content="{Binding Title}" Tag="{Binding IsAvailable}">
<Label.Style>
<Style TargetType="{x:Type Label}">
<Style.Triggers>
<DataTrigger Binding="{Binding Tag, RelativeSource={RelativeSource Self}}" Value="True">
<Setter Property="FontWeight" Value="Bold"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Label.Style>
</Label>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
您需要将ItemsSource
属性设置为Binding
到MyListBoxItem
集合。