2008-10-22 7 views
1

그룹화 항목과 함께 ListView가 있습니다. 그룹화는 사용자 지정 GroupStyle (확장기)을 사용합니다. 나는 모든 그룹을 확장하고 축소 할 수있는 확인란을 갖고 싶습니다. 그룹 헤더를 수동으로 클릭하고 해당 그룹을 확장하거나 축소 할 때까지 제대로 작동합니다. 해당 특정 그룹을 클릭하면 확인란 선택이 취소됩니다. 사용자가 그룹을 수동으로 클릭하면 바인딩이 끊어진 것처럼 보입니다.ElementName ControlTemplate에서 끊어진 바인딩

내가 뭘 잘못하고 있는지 알려주십시오.

고마워요.

감사합니다. 블라드.

<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

문제점에 대한 해결책을 찾았습니다. 할 일은 Mode = TwoWay와 UpdateSourceTrigger = Explicit를 지정하는 것입니다. 이렇게하면 Binding을 깨뜨리지 않고 모든 것이 잘 작동합니다. Bellow는 작업 코드의 한 예입니다.

<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> 
+0

이 해결 방법은 나에게 적합하지 않습니다. – jpierson

+0

나를 위해 동일합니다. RuntimeException에, 나는 또한 경로를 지정하도록 요청 받았다. 이것은'Path = .'로 설정합니다. 이것은 ErrorTemplate의'PlacementTarget = "{Binding ElementName = ImageAction, Path =., Mode = TwoWay, UpdateSourceTrigger = Explicit} 내 바인딩입니다."''ImageAction' 요소는 customcontrol이며, 샘플에서'chkExpandAll'과 같은 방식으로 추가되었습니다. – LuckyLikey

0

는 그것은 당신은 그 다음 바인딩을 깰 것이다 확장기 중 하나를 클릭하면,이 체크 박스에 한방향으로 설정되어 있기 때문에 깨진 바인딩처럼 보인다. TwoWay로 설정하면 항상 작동하지만 하나의 항목을 확장하면 모두 확장되므로 매우 유용하지는 않습니다.

이 솔루션은 Bindings를 사용하지 않고 대신 Storyboards를 사용하는 것입니다. 스토리 보드를 실행하면 현재 상태에 관계없이 모든 확장기가 참/거짓으로 설정됩니다. 체크 박스를 업데이트하는 것은 다소 복잡 할 수 있습니다. 왜냐하면 모든 체크 박스가 선택되었는지 또는 일부 체크 만되어 있는지 확인해야하는 로직이 있기 때문입니다.

+0

답장을 보내 주셔서 감사합니다. 스토리 보드를 통해 어떻게 할 수 있습니까? 내 예제를 사용할 수 있습니다. XAMLPad 및 KAXAML에서 작동하고 복사하여 붙여 넣기 만하면됩니다. 나는 또한 체크 박스를 업데이트하는 것에 대해 이해하지 못했다. 맨 위에는 하나의 체크 상자 만 있으며 모든 확장기를 확장하거나 모두 축소해야합니다. 업데이트하는 방법에 대해 걱정할 필요가 없다고 생각합니다. 다시 한번 감사드립니다. 감사합니다. 블라드. –

관련 문제