Dynamiczna zmiana kolejności kontrolek w WrapPanel

1

Witam.
Mam ciekawy problem do rozwiązania.
Mianowicie:
Mam DataGrid'a ze zdefiniowanym RowDetailsTemplate, w którym mam zaimplementowanych parę DataGrid'ów we WrapPanelu. Chodzi o to aby kontrolki te były zawsze wyświetlane na całej szerokości okna, a jeżeli się nie mieszczą to mają się zawinąć. I to działa rewelacyjnie.
Chciałbym aby użytkownik mógł zmieniać kolejność wyświetlania tych poszczególnych DataGridów w RowDetailsTemplate. Pomińmy w jaki sposób będzie ta kolejność ustalana, tylko jak dynamicznie zmienić kolejność tych kontrolek we WrapPanel'u? Każdy z tych DataGridów wyświetla inną zawartość i ma inny wygląd dlatego podmiana zawartości ItemSource'ów nie wchodzi w grę.
Zmiana na pojedynczym WrapPanelu odbywa się poprzez zmianę kolejności dodawania kontrolek do niego. Ale gdy WrapPanel jest zdefiniowany w RowDetailsTemplate nadrzędnego DataGrid'a to już się robi problem (każdy wiersz ma swoje źródło).

Czy ktoś może ma pomysł jak to ogarnąć?

1

Nie ma tam możliwości używania właściwości Content oraz Children żeby przechodzić po kontrolkach i jak dojdziesz do odpowiedniej to zrobić Children.Clear() i wsadzić od nowa albo zamienić tylko indeksami?

Jak dałbyś radę wstawić tutaj przykładowy kod XAML z tymi powsadzanymi gridami to by pomogło zrozumieć jak wygląda ten widok i powiedzieć coś więcej.

0

Wrzucam xaml'a:


            <DataTemplate x:Key="rowDetailsTemplate">
                <Grid Background="White">

                    <DataGrid Margin="8" ItemsSource="{Binding OnlySums}" Style="{StaticResource dataGridLocalStyle}"
                                          Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type dialog:ReservationPreviewDialog}}, Path=IsShowDetails, Mode=OneWay, Converter={StaticResource boolToVisibilityConverter}, ConverterParameter=Inverted}">
                        <DataGrid.Columns>
                            <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtPodgladRezerwacjiPokazPozycja}" Binding="{Binding Name}"/>
                            <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUslugaIlosc}" Binding="{Binding Amount}"
                                                        CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                            <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUslugaWartosc}" Binding="{Binding Value, StringFormat=N2}"
                                                        CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                            <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeDoRozliczenia}" Binding="{Binding ToSettlement, StringFormat=N2}"
                                                        CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                            <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeRozliczone}" Binding="{Binding Settlement, StringFormat=N2}"
                                                        CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                        </DataGrid.Columns>
                    </DataGrid>

                    <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" 
                                          Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type dialog:ReservationPreviewDialog}}, Path=IsShowDetails, Mode=OneWay, Converter={StaticResource boolToVisibilityConverter}}">
                        <WrapPanel Orientation="Horizontal" HorizontalAlignment="Stretch" MaxWidth="{Binding RelativeSource={RelativeSource AncestorType={x:Type dialog:ReservationPreviewDialog}}, Path=MaxWidth, Mode=OneWay}"
                                           x:Name="dgvWrapPanel">

                            <Grid Margin="4" Tag="0">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="Auto"/>
                                </Grid.RowDefinitions>

                                <TextBlock Grid.Row="0" Text="{lex:LocText SHot.Localization:UIStrings:txtPodgladRezerwacjiNoclegi}" Style="{StaticResource textHeader}"
                                           Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type dialog:ReservationPreviewDialog}}, Path=IsShowNights, Mode=OneWay, Converter={StaticResource boolToVisibilityConverter}}"/>
                                <DataGrid Grid.Row="1" ItemsSource="{Binding Nights}" Style="{StaticResource dataGridLocalStyle}" 
                                                  Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type dialog:ReservationPreviewDialog}}, Path=IsShowNights, Mode=OneWay, Converter={StaticResource boolToVisibilityConverter}}">
                                    <DataGrid.Columns>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUsluga}" Binding="{Binding Name}" Width="140"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUslugaDoba}" Binding="{Binding Night}" Width="90"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUslugaIlosc}" Binding="{Binding Amount}" Width="50"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUslugaWartosc}" Binding="{Binding Value, StringFormat=N2}" Width="70"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeDoRozliczenia}" Binding="{Binding ToSettlement, StringFormat=N2}" Width="100"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeRozliczone}" Binding="{Binding Settlement, StringFormat=N2}" Width="80"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                    </DataGrid.Columns>
                                </DataGrid>
                            </Grid>

                            <Grid Margin="4" Tag="1">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="Auto"/>
                                </Grid.RowDefinitions>

                                <TextBlock Grid.Row="0" Text="{lex:LocText SHot.Localization:UIStrings:txtPodgladRezerwacjiPokazPosilki}" Style="{StaticResource textHeader}"
                                           Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type dialog:ReservationPreviewDialog}}, Path=IsShowMeals, Mode=OneWay, Converter={StaticResource boolToVisibilityConverter}}"/>
                                <DataGrid Grid.Row="1" ItemsSource="{Binding Meals}" Style="{StaticResource dataGridLocalStyle}" 
                                                  Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type dialog:ReservationPreviewDialog}}, Path=IsShowMeals, Mode=OneWay, Converter={StaticResource boolToVisibilityConverter}}">
                                    <DataGrid.Columns>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtPodgladRezerwacjiPokazPosilek}" Binding="{Binding Name}" Width="140"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUslugaDoba}" Binding="{Binding Night}" MinWidth="90"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUslugaIlosc}" Binding="{Binding Amount}" Width="50"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUslugaWartosc}" Binding="{Binding Value, StringFormat=N2}" Width="70"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeDoRozliczenia}" Binding="{Binding ToSettlement, StringFormat=N2}" Width="100"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeRozliczone}" Binding="{Binding Settlement, StringFormat=N2}" Width="80"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                    </DataGrid.Columns>
                                </DataGrid>
                            </Grid>

                            <Grid Margin="4" Tag="2">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="Auto"/>
                                </Grid.RowDefinitions>

                                <TextBlock Grid.Row="0" Text="{lex:LocText SHot.Localization:UIStrings:txtPodgladRezerwacjiPokazAtrakcje}" Style="{StaticResource textHeader}"
                                           Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type dialog:ReservationPreviewDialog}}, Path=IsShowAttractions, Mode=OneWay, Converter={StaticResource boolToVisibilityConverter}}"/>
                                <DataGrid Grid.Row="1" ItemsSource="{Binding Attractions}" Style="{StaticResource dataGridLocalStyle}" 
                                                  Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type dialog:ReservationPreviewDialog}}, Path=IsShowAttractions, Mode=OneWay, Converter={StaticResource boolToVisibilityConverter}}">
                                    <DataGrid.Columns>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeAtrakcjeNazwa}" Binding="{Binding Name}" Width="90"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtPodgladRezerwacjiOkres}" Binding="{Binding Night}" MinWidth="140"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUslugaIlosc}" Binding="{Binding Amount}" Width="50"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUslugaWartosc}" Binding="{Binding Value, StringFormat=N2}" Width="70"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeDoRozliczenia}" Binding="{Binding ToSettlement, StringFormat=N2}" Width="100"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeRozliczone}" Binding="{Binding Settlement, StringFormat=N2}" Width="80"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                    </DataGrid.Columns>
                                </DataGrid>
                            </Grid>

                            <Grid Margin="4" Tag="3">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="Auto"/>
                                </Grid.RowDefinitions>

                                <TextBlock Grid.Row="0" Text="{lex:LocText SHot.Localization:UIStrings:txtPodgladRezerwacjiPokazParkingi}" Style="{StaticResource textHeader}"
                                           Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type dialog:ReservationPreviewDialog}}, Path=IsShowParkings, Mode=OneWay, Converter={StaticResource boolToVisibilityConverter}}"/>
                                <DataGrid Grid.Row="1" ItemsSource="{Binding Parkings}" Style="{StaticResource dataGridLocalStyle}" 
                                                  Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type dialog:ReservationPreviewDialog}}, Path=IsShowParkings, Mode=OneWay, Converter={StaticResource boolToVisibilityConverter}}">
                                    <DataGrid.Columns>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtPodgladRezerwacjiMiejsce}" Binding="{Binding Name}" Width="54"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtPodgladRezerwacjiOkres}" Binding="{Binding Night}" Width="176"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUslugaIlosc}" Binding="{Binding Amount}" Width="50"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUslugaWartosc}" Binding="{Binding Value, StringFormat=N2}" Width="70"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeDoRozliczenia}" Binding="{Binding ToSettlement, StringFormat=N2}" Width="100"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeRozliczone}" Binding="{Binding Settlement, StringFormat=N2}" Width="80"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                    </DataGrid.Columns>
                                </DataGrid>
                            </Grid>

                            <Grid Margin="4" Tag="4">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="Auto"/>
                                </Grid.RowDefinitions>

                                <TextBlock Grid.Row="0" Text="{lex:LocText SHot.Localization:UIStrings:txtPodgladRezerwacjiPokazMiniBar}" Style="{StaticResource textHeader}"
                                           Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type dialog:ReservationPreviewDialog}}, Path=IsShowMiniBar, Mode=OneWay, Converter={StaticResource boolToVisibilityConverter}}"/>
                                <DataGrid Grid.Row="1" ItemsSource="{Binding MiniBars}" Style="{StaticResource dataGridLocalStyle}" 
                                                  Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type dialog:ReservationPreviewDialog}}, Path=IsShowMiniBar, Mode=OneWay, Converter={StaticResource boolToVisibilityConverter}}">
                                    <DataGrid.Columns>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeProdukt}" Binding="{Binding Name}" Width="140"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUslugaDoba}" Binding="{Binding Night}" MinWidth="90"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUslugaIlosc}" Binding="{Binding Amount}" Width="50"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUslugaWartosc}" Binding="{Binding Value, StringFormat=N2}" Width="70"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeDoRozliczenia}" Binding="{Binding ToSettlement, StringFormat=N2}" Width="100"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeRozliczone}" Binding="{Binding Settlement, StringFormat=N2}" Width="80"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                    </DataGrid.Columns>
                                </DataGrid>
                            </Grid>

                            <Grid Margin="4" Tag="5">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="Auto"/>
                                </Grid.RowDefinitions>

                                <TextBlock Grid.Row="0" Text="{lex:LocText SHot.Localization:UIStrings:txtPodgladRezerwacjiZHotelu}" Style="{StaticResource textHeader}"
                                           Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type dialog:ReservationPreviewDialog}}, Path=IsShowHotels, Mode=OneWay, Converter={StaticResource boolToVisibilityConverter}}"/>
                                <DataGrid Grid.Row="1" ItemsSource="{Binding Hotels}" Style="{StaticResource dataGridLocalStyle}" 
                                                  Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type dialog:ReservationPreviewDialog}}, Path=IsShowHotels, Mode=OneWay, Converter={StaticResource boolToVisibilityConverter}}">
                                    <DataGrid.Columns>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUsluga}" Binding="{Binding Name}" Width="140"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUslugaDoba}" Binding="{Binding Night}" Width="90"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUslugaIlosc}" Binding="{Binding Amount}" Width="50"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUslugaWartosc}" Binding="{Binding Value, StringFormat=N2}" Width="70"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeDoRozliczenia}" Binding="{Binding ToSettlement, StringFormat=N2}" Width="100"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeRozliczone}" Binding="{Binding Settlement, StringFormat=N2}" Width="80"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                    </DataGrid.Columns>
                                </DataGrid>
                            </Grid>

                            <Grid Margin="4" Tag="6">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="Auto"/>
                                </Grid.RowDefinitions>

                                <TextBlock Grid.Row="0" Text="{lex:LocText SHot.Localization:UIStrings:txtPodgladRezerwacjiPokazUslugi}" Style="{StaticResource textHeader}"
                                                   Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type dialog:ReservationPreviewDialog}}, Path=IsShowServices, Mode=OneWay, Converter={StaticResource boolToVisibilityConverter}}"/>
                                <DataGrid Grid.Row="1" ItemsSource="{Binding Services}" Style="{StaticResource dataGridLocalStyle}" 
                                                  Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type dialog:ReservationPreviewDialog}}, Path=IsShowServices, Mode=OneWay, Converter={StaticResource boolToVisibilityConverter}}">
                                    <DataGrid.Columns>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUsluga}" Binding="{Binding Name}" Width="140"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUslugaDoba}" Binding="{Binding Night}" Width="90"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUslugaIlosc}" Binding="{Binding Amount}" Width="50"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUslugaWartosc}" Binding="{Binding Value, StringFormat=N2}" Width="70"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeDoRozliczenia}" Binding="{Binding ToSettlement, StringFormat=N2}" Width="100"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeRozliczone}" Binding="{Binding Settlement, StringFormat=N2}" Width="80"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                    </DataGrid.Columns>
                                </DataGrid>
                            </Grid>

                            <Grid Margin="4" Tag="7">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="Auto"/>
                                </Grid.RowDefinitions>

                                <TextBlock Grid.Row="0" Text="{lex:LocText SHot.Localization:UIStrings:txtPodgladRezerwacjiPokazZRestauracji}" Style="{StaticResource textHeader}"
                                                   Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type dialog:ReservationPreviewDialog}}, Path=IsShowRestaurant, Mode=OneWay, Converter={StaticResource boolToVisibilityConverter}}"/>
                                <DataGrid Grid.Row="1" ItemsSource="{Binding Restaurants}" Style="{StaticResource dataGridLocalStyle}" 
                                                  Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type dialog:ReservationPreviewDialog}}, Path=IsShowRestaurant, Mode=OneWay, Converter={StaticResource boolToVisibilityConverter}}">
                                    <DataGrid.Columns>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUsluga}" Binding="{Binding Name}" Width="140"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUslugaDoba}" Binding="{Binding Night}" Width="90"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUslugaIlosc}" Binding="{Binding Amount}" Width="50"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUslugaWartosc}" Binding="{Binding Value, StringFormat=N2}" Width="70"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeDoRozliczenia}" Binding="{Binding ToSettlement, StringFormat=N2}" Width="100"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeRozliczone}" Binding="{Binding Settlement, StringFormat=N2}" Width="80"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                    </DataGrid.Columns>
                                </DataGrid>
                            </Grid>

                            <Grid Margin="4" Tag="8">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="Auto"/>
                                </Grid.RowDefinitions>

                                <TextBlock Grid.Row="0" Text="{lex:LocText SHot.Localization:UIStrings:txtPodgladRezerwacjiSrodkiTrwale}" Style="{StaticResource textHeader}"
                                                   Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type dialog:ReservationPreviewDialog}}, Path=IsShowAssets, Mode=OneWay, Converter={StaticResource boolToVisibilityConverter}}"/>
                                <DataGrid Grid.Row="1" ItemsSource="{Binding Assets}" Style="{StaticResource dataGridLocalStyle}" 
                                                  Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type dialog:ReservationPreviewDialog}}, Path=IsShowAssets, Mode=OneWay, Converter={StaticResource boolToVisibilityConverter}}">
                                    <DataGrid.Columns>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtAtrakcjeRezerwacjeUslugiSrodekTrwaly}" Binding="{Binding Name}" Width="230"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUslugaIlosc}" Binding="{Binding Amount}" Width="50"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeUslugaWartosc}" Binding="{Binding Value, StringFormat=N2}" Width="70"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeDoRozliczenia}" Binding="{Binding ToSettlement, StringFormat=N2}" Width="100"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                        <DataGridTextColumn Header="{lex:LocText SHot.Localization:UIStrings:txtRezerwacjeRozliczone}" Binding="{Binding Settlement, StringFormat=N2}" Width="80"
                                                            CellStyle="{StaticResource RightGridCellLocalStyle}"/>
                                    </DataGrid.Columns>
                                </DataGrid>
                            </Grid>

                        </WrapPanel>
                    </ScrollViewer>
                </Grid>

            </DataTemplate>

Idąc tym tropem przerzuciłem całość do Resources i przed załadowaniem w kodzie modyfikuję tego template'a, ale niestety nie widzę efektu zmian.
Kod który wykonuję:

DataTemplate dt = this.Resources["rowDetailsTemplate"] as DataTemplate;

try
{
    DependencyObject dio = dt.LoadContent();
    List<object> tree = dio.GetVisualTreeChildren<object>(true);
    ScrollViewer sv = tree.Find(x => x is ScrollViewer) as ScrollViewer;
    if (sv != null && sv.Content is WrapPanel)
    {
        WrapPanel wp = sv.Content as WrapPanel;
        Grid[] list = new Grid[wp.Children.Count];
        foreach (Grid g in wp.Children)
        {
            int lp = int.Parse(g.Tag as string);
            switch (lp)
            {
                case 0:
                    list[1]=g; 
                    break;
                case 1:
                    list[0] = g;
                    break;
                default:
                    list[lp] = g;
                    break;
            }
        }
        wp.Children.Clear();
        for (int i = 0; i < list.Length; i++)
        {
            wp.Children.Add(list[i]);
        }
        bool d = dt.IsSealed;
    }
}
catch (Exception exp)
{
}

dgvRecords.RowDetailsTemplate = dt;

Wygląda to tak, jakby zmiany wykonane na zaczytanym templat'ie nie były widoczne dla programu. Zawartość templatu wyciągam metodą LoadContent(). A czy po zmianach trzeba wywołać jakąś przeciwną metodę aby zmiany zostały uwzględnione w template? Czy coś po prostu robię źle?

0

Zauważyłem, że po załadowaniu template z resources właściwość IsSealed mam ustawioną na true, co oznacza że obiekt jest zablokowany do zmian. Co zrobić aby go odblokować?

0

DataTemplate jest tylko definicją a nie rzeczywistymi kontrolkami i po załadowaniu go nie ma możliwości jego edycji. Musiałbyś stworzyć nowy template, skopiować dane z istniejącego template'u do nowego i przypisać nowy template do grida co nie jest prostą sprawą dla tak rozbudowanego templatu.

Jeśli celem jest tylko zamiana kolejnością elementów w runtimie to możesz to zrobić następująco:

public partial class MainWindow : Window
{
    FrameworkElement? rowDetailsElement = null;

    public MainWindow()
    {
        InitializeComponent();
        dataGrid.ItemsSource = new List<int>() { 1, 2, 3, 4, 5, 6, 7 };
        dataGrid.LoadingRowDetails += MyDataGrid_LoadingRowDetails;
    }

    //Event przypięty do przycisku do zamiany kolejności
    private void SwapButtonClick(object sender, RoutedEventArgs e)
    {
        if (rowDetailsElement != null)
        {
            IterateVisualTree(rowDetailsElement);
        }
    }

    private void IterateVisualTree(DependencyObject parent)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(parent, i);
            
            //Zmodyfikuj co trzeba i kiedy trzeba
            if (child is WrapPanel wrapPanel)
            {
                UIElement grid1 = wrapPanel.Children[0];
                UIElement grid2 = wrapPanel.Children[1];
                wrapPanel.Children.RemoveAt(0);
                wrapPanel.Children.RemoveAt(0);
                wrapPanel.Children.Insert(0, grid1);
                wrapPanel.Children.Insert(0, grid2);
            }

            //Szukaj dalej
            IterateVisualTree(child);
        }
    }

    private void MyDataGrid_LoadingRowDetails(object sender, DataGridRowDetailsEventArgs e)
    {
        //Zapisanie referencji do obecngo wiersza ze szczegółami
        rowDetailsElement = e.DetailsElement;
    }
}

W tym kodzie utworzona jest zmienna FrameworkElement? rowDetailsElement = null; która ma za zadanie trzymać referencję do obecnie wyświetlanego wiersza ze szczegółami.
Uzupełniamy ją przy ładowaniu szczegółow w metodzie eventu ładowania MyDataGrid_LoadingRowDetails.
Po naciśnięciu na przycisk do zamiany kolejności przechodzimy przez drzewko elementów i modyfikujemy to co nas interesuje.

Teraz pytanie czy potrzebujesz zapisywać tą kolejność czy nie.
Jak ma być to dynamicznie z zapisywaniem to ja bym zrobił nowy widok zamiast tego templatu i tam zimplementował całą logikę do zamiany i zapisywania kolejności gdzieś poza templatem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1