我正在使用CVM和WPF创建一个Windows应用程序,使用MVVM。我正在尝试创建一个可折叠的项目控件,以显示集合中的项目。展开每个项目时,应显示包含项目属性的组框。我在UserControl中有以下内容:
<UserControl.Resources>
<SolidColorBrush x:Key="GlyphBrush" Color="#444" />
<ControlTemplate x:Key="toggleButtonTemplate" TargetType="ToggleButton">
<Grid
Width="15"
Height="13"
Background="Transparent">
<Path x:Name="ExpandPath"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Margin="1,1,1,1"
Fill="{StaticResource GlyphBrush}"
Data="M 4 0 L 8 4 L 4 8 Z"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked"
Value="True">
<Setter Property="Data"
TargetName="ExpandPath"
Value="M 0 4 L 8 4 L 4 8 Z"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<Style x:Key="toggleButtonStyle" TargetType="ToggleButton">
<Setter Property="Template" Value="{StaticResource toggleButtonTemplate}" />
</Style>
<BooleanToVisibilityConverter x:Key="VisibilityOfBool" />
<Style x:Key="CollapsibleListStyle" TargetType="{x:Type ItemsControl}">
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style>
<Setter Property="Control.Margin" Value="5" />
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate TargetType="ContentControl">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ContentPresenter Grid.Column="0" Focusable="False">
</ContentPresenter>
<ToggleButton x:Name="toggleButton"
Grid.Column="1" IsChecked="False" Margin="3.5"
Style="{StaticResource toggleButtonStyle}" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<WrapPanel>
<ItemsControl Name="itemsList"
Style="{StaticResource CollapsibleListStyle}"
ItemsSource="{Binding ViewModel.Items}"
Margin="0,0">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel IsItemsHost="True" Orientation="Vertical"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid HorizontalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Name}" Grid.Column="0"
FontWeight="DemiBold" VerticalAlignment="Center"/>
<GroupBox Header="Properties" Grid.Column="1" Margin="5"
Visibility="{Binding ElementName=toggleButton,
Path=IsChecked, Converter={StaticResource VisibilityOfBool}}">
<WrapPanel HorizontalAlignment="Center">
<StackPanel Orientation="Horizontal" Margin="5">
<TextBlock Text="Code: "/>
<TextBlock Text="{Binding ItemCode}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="5">
<TextBlock Text="Key: "/>
<TextBlock Text="{Binding ItemKey}"/>
</StackPanel>
</WrapPanel>
</GroupBox>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</WrapPanel>
这会在运行时产生以下错误:
System.Windows.Data错误:4:找不到绑定源 引用'ElementName = toggleButton'。 BindingExpression:路径=器isChecked;的DataItem = NULL;目标要素 是'GroupBox'(Name =''); target属性是'Visibility'(类型 '能见度')
因此不会显示切换按钮。 在我的应用程序的不同位置,我使用了上面的内容,但用ListBox替换了ItemsControl,以获得可折叠的列表框,代码可以正常工作。 但是,这里我不想要选择功能。
有人可以帮忙吗?
谢谢你,Brian
答案 0 :(得分:1)
如果你知道的话,你应该总是指定TargetType
,你的风格没有正确应用,因为你没有设置它是通用的,同时设置容器上不存在的属性,因此忽略。
将TargetType
更改为ContentPresenter
,您将无法再设置Template
:
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Template"> <!-- will throw an error -->
您需要将所有内容移至ItemTemplate
,因为没有设置ControlTemplate
。