XAML ListBox 中 ContainerStyle 和 ContentTemplate 的单独绑定
XAML separate binding of ContainerStyle and ContentTemplate in ListBox
我试了一段时间,在网上搜索没有成功...现在我敢自己在Whosebug上问了。
因此,目的是将 ItemContainerStyle
和 ListBoxItem
的 ContentTemplate
的定义分开。我在 ResourceDictionary
中定义了 ListBoxItemStyle
,在 Window.Resources
中定义了两个不同的 DataTemplates
。
我现在想根据 ResourceDictionary
中定义的样式设置 ListBoxItem
的样式,并使用触发器 (IsMouseOver
) 更改 DataTemplate
。
我的 (不工作) 代码是这样的:
<ListBox HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="20,60,10,10"
Grid.Row="1" Grid.Column="0"
PreviewMouseMove="DragMove_PreviewMouseMove"
PreviewMouseLeftButtonDown="Drag_PreviewMouseLeftButtonDown"
ItemsSource="{Binding Persons}" VerticalContentAlignment="Center"
Style="{StaticResource DefaultListBoxStyle}">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Style" Value="{StaticResource DefaultListBoxItemStyle}"/>
<Setter Property="ContentTemplate" Value="{StaticResource PersonsListBoxItemTemplate_default}"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="ContentTemplate" Value="{StaticResource PersonsListBoxItemTemplate_infoButtons}"/>
</Trigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
其中 DefaultListBoxStyle
是 ResourceDictionary
中定义的样式,PersonsListBoxItemTemplate_default
& PersonsListBoxItemTemplate_infoButtons
是 Window.Resources
中定义的数据模板。
现在我得到一个错误,样式对象不能影响它所属对象的样式-属性。
我尝试了不同的方法,但都没有成功...我也尝试过先定义样式,然后再更改模板,但也没有用。
谢谢大家的帮助!
所以你不能在Style with Setter中设置Style 属性。为此,您需要使用 BasedOn:
<Style TargetType="ListBoxItem" BasedOn="{StaticResource DefaultListBoxItemStyle}">
<Setter ... />
</Style>
我试了一段时间,在网上搜索没有成功...现在我敢自己在Whosebug上问了。
因此,目的是将 ItemContainerStyle
和 ListBoxItem
的 ContentTemplate
的定义分开。我在 ResourceDictionary
中定义了 ListBoxItemStyle
,在 Window.Resources
中定义了两个不同的 DataTemplates
。
我现在想根据 ResourceDictionary
中定义的样式设置 ListBoxItem
的样式,并使用触发器 (IsMouseOver
) 更改 DataTemplate
。
我的 (不工作) 代码是这样的:
<ListBox HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="20,60,10,10"
Grid.Row="1" Grid.Column="0"
PreviewMouseMove="DragMove_PreviewMouseMove"
PreviewMouseLeftButtonDown="Drag_PreviewMouseLeftButtonDown"
ItemsSource="{Binding Persons}" VerticalContentAlignment="Center"
Style="{StaticResource DefaultListBoxStyle}">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Style" Value="{StaticResource DefaultListBoxItemStyle}"/>
<Setter Property="ContentTemplate" Value="{StaticResource PersonsListBoxItemTemplate_default}"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="ContentTemplate" Value="{StaticResource PersonsListBoxItemTemplate_infoButtons}"/>
</Trigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
其中 DefaultListBoxStyle
是 ResourceDictionary
中定义的样式,PersonsListBoxItemTemplate_default
& PersonsListBoxItemTemplate_infoButtons
是 Window.Resources
中定义的数据模板。
现在我得到一个错误,样式对象不能影响它所属对象的样式-属性。
我尝试了不同的方法,但都没有成功...我也尝试过先定义样式,然后再更改模板,但也没有用。
谢谢大家的帮助!
所以你不能在Style with Setter中设置Style 属性。为此,您需要使用 BasedOn:
<Style TargetType="ListBoxItem" BasedOn="{StaticResource DefaultListBoxItemStyle}">
<Setter ... />
</Style>