wpf中的可折叠项控件 - “System.Windows.Data Error:4”

时间:2012-02-14 13:45:51

标签: .net wpf xaml itemscontrol togglebutton

我正在使用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

1 个答案:

答案 0 :(得分:1)

如果你知道的话,你应该总是指定TargetType,你的风格没有正确应用,因为你没有设置它是通用的,同时设置容器上不存在的属性,因此忽略。

TargetType更改为ContentPresenter,您将无法再设置Template

<ItemsControl.ItemContainerStyle>
    <Style TargetType="ContentPresenter">
        <Setter Property="Template"> <!-- will throw an error -->

您需要将所有内容移至ItemTemplate,因为没有设置ControlTemplate