代码之家  ›  专栏  ›  技术社区  ›  Vlad Bezden

控件模板中的elementname绑定已中断

  •  1
  • Vlad Bezden  · 技术社区  · 17 年前

    我有带有分组项的ListView。分组使用自定义GroupStyle(Expander)。我希望有一个复选框,它将在以下情况下展开和折叠所有组。它可以很好地工作,直到我手动单击组标题并展开或折叠该组。单击特定组后,停止响应复选框选择。用户手动单击组后,绑定似乎已断开。

    请告诉我做错了什么。

    谢谢。

    真诚地, 弗拉德。

    <Window xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
            xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
        <Window.Resources>
            <XmlDataProvider x:Key="MyData" XPath="/Info">
                <x:XData>
                    <Info xmlns="">
                        <Item Name="Item 1" Category="Cat1" />
                        <Item Name="Item 2" Category="Cat1" />
                        <Item Name="Item 3" Category="Cat2" />
                        <Item Name="Item 4" Category="Cat2" />
                        <Item Name="Item 5" Category="Cat2" />
                        <Item Name="Item 6" Category="Cat3" />
                    </Info>
                </x:XData>
            </XmlDataProvider>
    
            <CollectionViewSource x:Key='src' Source="{Binding Source={StaticResource MyData}, XPath=Item}">
                <CollectionViewSource.GroupDescriptions>
                    <PropertyGroupDescription PropertyName="@Category" />
                </CollectionViewSource.GroupDescriptions>
            </CollectionViewSource>
    
            <ControlTemplate x:Key="ListTemplate" TargetType="ListView">
                <ListView BorderThickness="0"
                          ItemsSource='{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ItemsSource}'
                          DisplayMemberPath="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DisplayMemberPath}">
                    <ListView.GroupStyle>
                        <GroupStyle>
                            <GroupStyle.ContainerStyle>
                                <Style TargetType="{x:Type GroupItem}">
                                    <Setter Property="Margin" Value="0,0,0,5" />
                                    <Setter Property="Template">
                                        <Setter.Value>
                                            <ControlTemplate TargetType="{x:Type GroupItem}">
                                                <Expander IsExpanded="{Binding IsChecked, ElementName=chkExpandAll, Mode=OneWay}">
                                                    <Expander.Header>
                                                        <DockPanel>
                                                            <TextBlock FontWeight="Bold" Text="{Binding Path=Name}" Margin="5,0,0,0" Width="100" />
                                                            <TextBlock FontWeight="Bold" Text="{Binding Path=ItemCount}" />
                                                        </DockPanel>
                                                    </Expander.Header>
                                                    <Expander.Content>
                                                        <ItemsPresenter />
                                                    </Expander.Content>
                                                </Expander>
                                            </ControlTemplate>
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </GroupStyle.ContainerStyle>
                        </GroupStyle>
                    </ListView.GroupStyle>
                </ListView>
            </ControlTemplate>
        </Window.Resources>
    
        <StackPanel>
            <CheckBox Name="chkExpandAll" IsChecked="True" Content="Expand All" />
            <ListView ItemsSource='{Binding Source={StaticResource src}}' DisplayMemberPath="@Name" BorderThickness="1" Template="{StaticResource ListTemplate}" />
        </StackPanel>
    
    </Window>
    
    2 回复  |  直到 17 年前
        1
  •  2
  •   akjoshi HCP    14 年前

    我找到了解决问题的方法。需要做的是指定mode=twoway和updateSourceTrigger=explicit,这样它就不会破坏绑定,并且一切正常。下面是一个工作代码的例子。

    <Window xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
            xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
        <Window.Resources>
            <XmlDataProvider x:Key="MyData" XPath="/Info">
                <x:XData>
                    <Info xmlns="">
                        <Item Name="Item 1" Category="Cat1" />
                        <Item Name="Item 2" Category="Cat1" />
                        <Item Name="Item 3" Category="Cat2" />
                        <Item Name="Item 4" Category="Cat2" />
                        <Item Name="Item 5" Category="Cat2" />
                        <Item Name="Item 6" Category="Cat3" />
                    </Info>
                </x:XData>
            </XmlDataProvider>
    
            <CollectionViewSource x:Key='src' Source="{Binding Source={StaticResource MyData}, XPath=Item}">
                <CollectionViewSource.GroupDescriptions>
                    <PropertyGroupDescription PropertyName="@Category" />
                </CollectionViewSource.GroupDescriptions>
            </CollectionViewSource>
    
            <ControlTemplate x:Key="ListTemplate" TargetType="ListView">
                <ListView BorderThickness="0"
                          ItemsSource='{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ItemsSource}'
                          DisplayMemberPath="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DisplayMemberPath}">
                    <ListView.GroupStyle>
                        <GroupStyle>
                            <GroupStyle.ContainerStyle>
                                <Style TargetType="{x:Type GroupItem}">
                                    <Setter Property="Margin" Value="0,0,0,5" />
                                    <Setter Property="Template">
                                        <Setter.Value>
                                            <ControlTemplate TargetType="{x:Type GroupItem}">
                                              <StackPanel>
                                                <Expander Name="exp" IsExpanded="{Binding IsChecked, ElementName=chkExpandAll, Mode=TwoWay, UpdateSourceTrigger=Explicit}">
                                                    <Expander.Header>
                                                        <DockPanel>
                                                            <TextBlock FontWeight="Bold" Text="{Binding Path=Name}" Margin="5,0,0,0" Width="100" />
                                                            <TextBlock FontWeight="Bold" Text="{Binding Path=ItemCount}" />
                                                        </DockPanel>
                                                    </Expander.Header>
                                                    <Expander.Content>
                                                        <ItemsPresenter />
                                                    </Expander.Content>
                                                </Expander>
                                                </StackPanel>
                                            </ControlTemplate>
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </GroupStyle.ContainerStyle>
                        </GroupStyle>
                    </ListView.GroupStyle>
                </ListView>
            </ControlTemplate>
        </Window.Resources>
    
        <StackPanel>
            <CheckBox Name="chkExpandAll" Content="Expand All" />
            <ListView ItemsSource='{Binding Source={StaticResource src}}' DisplayMemberPath="@Name" BorderThickness="1" Template="{StaticResource ListTemplate}" />
        </StackPanel>
    
    </Window>
    
        2
  •  0
  •   justin.m.chase    17 年前

    似乎绑定已断开,因为它已设置为单向复选框,然后如果单击任何扩展程序,它将断开绑定。将其设置为twoway将使其始终工作,但扩展一个项将使它们全部扩展,这不是很有用。

    我相信解决这个问题的方法不是使用绑定,而是使用故事板。您可以触发一个故事板,它将导致所有扩展器设置为true/false,而不管其当前状态如何。不过,更新复选框可能更复杂,因为需要一些逻辑来查看是否选中了所有复选框或只有部分复选框。

    推荐文章