2016-09-17 10 views
8

Próbuję znaleźć ToggleButton powiązanych w moim CollectionViewGroup, mój XAML struktura jest następująca:Nie mogli znaleźć ToggleButton w CollectionViewGroup

<UserControl.Resources> 
    <CollectionViewSource Source="{Binding Matches}" x:Key="GroupedItems"> 
     <CollectionViewSource.GroupDescriptions> 
      <PropertyGroupDescription PropertyName="MatchNation" /> 
      <PropertyGroupDescription PropertyName="MatchLeague" /> 
     </CollectionViewSource.GroupDescriptions> 
</UserControl.Resources> 

Jak widać Mam CollectionViewGroup że filtrować ObservableCollection binded Matches dla Nation i League.

Do tego mam uznany za ListView że mają dwa GroupStyle, że jeden filtr dla Country i inny dla League, w tym kawałku kodu dodam tylko drugi GroupStyle (który zawiera ToggleButton):

<ListView ItemsSource="{Binding Source={StaticResource GroupedItems}}"> 
    <!-- this is the second group style --> 
    <ListView.GroupStyle> 
     <GroupStyle> 
      <GroupStyle.ContainerStyle> 
       <Style TargetType="{x:Type GroupItem}" > 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate> 
           <Expander IsExpanded="True" Background="#4F4F4F"> 
            <Expander.Header> 
             <DockPanel Height="16.5"> 
              <TextBlock Text="{Binding Name}" FontWeight="Bold" Foreground="White" FontSize="11.5" VerticalAlignment="Bottom" /> 

              <ToggleButton Checked="{Binding IsFavourite}" HorizontalAlignment="Right"/> 

             </DockPanel> 
            </Expander.Header> 
            <ItemsPresenter /> 
           </Expander> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </Style> 
      </GroupStyle.ContainerStyle> 
     </GroupStyle> 
    </ListView.GroupStyle> 
</ListView> 

A więc, jak widać w stylu drugiej grupy (Nation -> League) Mam ToggleButton.

Teraz GroupStyle będzie powtarzany na podstawie elementów dostępnych w ObservableCollection, więc na przykład:

|England 
    |Premier League 
    1. item 
    2. item 
    3. item 
|Afghanistan 
    |Afghan Premier League 
    1. item 
    2. item 

jest to organizacja, teraz wyobrazić, że dla Premier League z England i Afghan Premier League z Afghanistan jest ToggleButton, które wstawiłem po prawej stronie, potrzebuję uzyskać wszystkie ToggleButtons z każdego Group dostępnego na liście. Próbowałem to:

var playingListSource = (ListCollectionView).Playing.Items.SourceCollection; 

foreach (var gp in playingListSource.Groups) 
{ 
     var rootGroup = (CollectionViewGroup)gp; //Convert the nested group 
     var parentGroup = rootGroup.Items; 
} 

Zasadniczo wyodrębnić grupę o liście i starał się znaleźć ToggleButton na Nester grupy, ale nie mogę go znaleźć. Ktoś może mi pomóc?

Odpowiedz

3

Przede wszystkim będzie dużo łatwiej, jeśli nazwiemy ToggleButton, abyśmy mogli później skorzystać z metody ControlTemplate.FindName. Tak oto ToggleButton:

<ToggleButton x:Name="PART_ToggleButton" 
       Checked="{Binding IsFavourite}" 
       HorizontalAlignment="Right" /> 

Co musimy teraz jest, aby nasze ręce na pojemniku na matrycy (a sterowania GroupItem). Do tego możemy użyć metody ListView.ItemContainerGenerator.ContainerFromItem.

Wiedząc, że oto kawałek kodu, który należy pobrać ToggleButton w pytaniu:

//we assume listView is a reference to the ListView 
var playingListSource = (ListCollectionView)listView.ItemsSource; 
//first we iterate over the top-level groups 
foreach (CollectionViewGroup nationGroup in playingListSource.Groups) 
{ 
    //second-level groups are items of their parents 
    foreach (CollectionViewGroup leagueGroup in nationGroup.Items) 
    { 
     //first we retrieve the GroupItem control associated with current second-level group 
     var container = listView.ItemContainerGenerator.ContainerFromItem(leagueGroup) as GroupItem; 
     //then we find the named ToggleButton inside the template 
     var toggleButton = container.Template.FindName("PART_ToggleButton", container) as ToggleButton; 
     //at this point we have a reference to the ToggleButton 
    } 
} 
+0

Dzięki za odpowiedź, próbowałem kodu ale mam problem, zmienna 'toggleButton' jest waloryzowana z Wartość 'null'. To jest obraz zawartości właściwości 'Szablon', gdzie wywołujesz metodę' ZnajdźNazwa': http://imgur.com/a/EqY6k – Unchained

+0

Czy możesz potwierdzić, że: ** a) ** masz przypisany name z 'x: Name =" PART_ToggleButton "' do kontrolki wewnątrz szablonu, ** b) ** wywołujesz 'FindName' o dokładnie takiej samej nazwie, o której mowa w _a) _ (" PART_ToggleButton "to tylko przykład, możesz to zmienić, ale musi być taka sama w obu miejscach), i ** c) ** kontrola, do której przypisano nazwę ** jest ** w rzeczywistości 'ToggleButton' (lub pochodzi od niego)? – Grx70

+0

W końcu znalazłem problem. Więc próbowałem twojego kodu wstawiając 'ToggleButton' w' Template' i działa dobrze, w pierwszym ćwiczeniu to nie działa, ponieważ nadpisałem ToggleButton własnym stylem. Więc w "szablonie" mam 'UserControl' z' ToggleButton' wewnątrz, po więcej szczegółów utworzyłem wklejkę: http://pastebin.com/CXybKUFn Dodaję też komentarze, aby lepiej wyjaśnić sytuację . – Unchained

Powiązane problemy