Wpf создать динамическую таблицу с использованием Itemsources - PullRequest
0 голосов
/ 25 июня 2018

Мне удалось создать эту таблицу с использованием стековых панелей и элементов управления, но, в конце концов, для загрузки требуется много времени.В моей ViewModel у меня есть список отелей, в которых есть номера.Каждая комната на каждый день в диапазоне, который я установил, может быть зарезервирована или нет и т. Д. Так что в моем представлении мне нужно отобразить эти данные в динамической таблице (?), Где в каждой строке будет каждая гостиница, тогда в каждой гостинице будет каждая комната,затем столбцы месяцев и каждой даты и т. д., как вы можете видеть на картинке.Наконец, каждый квадрат - это кнопка с всплывающей подсказкой, показывающей дополнительную информацию, и при нажатии она должна выбрать строку и столбец.Мне удалось сделать это для колонки, установив более смелый цвет.Все работает, но я думаю, что это неправильная реализация, и для этого также нужно много времени для рендеринга.

Вот мой вывод

enter image description here

и xaml

                   <ScrollViewer HorizontalScrollBarVisibility="Auto"
                                  VerticalScrollBarVisibility="Disabled">
                        <Border BorderBrush="Black"
                                BorderThickness="1"
                                Visibility="{Binding IsPlanVisible, Converter={StaticResource BoolToVisibilityConverter}}"
                                VerticalAlignment="Top"
                                HorizontalAlignment="Left">
                            <Grid VerticalAlignment="Top">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto" />
                                    <RowDefinition Height="*" />
                                </Grid.RowDefinitions>
                                <StackPanel Orientation="Horizontal"
                                            VerticalAlignment="Top">
                                    <Border Width="150"
                                            BorderBrush="Black"
                                            BorderThickness="0,0,0,1">
                                        <TextBlock Text="Hotel"
                                                   Margin="5,0"
                                                   HorizontalAlignment="Left"
                                                   VerticalAlignment="Center" />
                                    </Border>
                                    <Border BorderBrush="Black"
                                            Width="110"
                                            BorderThickness="1,0,1,1">
                                        <TextBlock Text="RoomType" Margin="5"
                                                   HorizontalAlignment="Center"
                                                   VerticalAlignment="Center" />
                                    </Border>
                                    <ItemsControl ItemsSource="{Binding Months}">
                                        <ItemsControl.ItemsPanel>
                                            <ItemsPanelTemplate>
                                                <StackPanel Orientation="Horizontal" />
                                            </ItemsPanelTemplate>
                                        </ItemsControl.ItemsPanel>
                                        <ItemsControl.ItemTemplate>
                                            <DataTemplate>
                                                <!--<Border>-->
                                                <StackPanel Orientation="Vertical"
                                                            Background="{Binding Background}">
                                                    <TextBlock Text="{Binding Name}"
                                                               MinHeight="30"
                                                               VerticalAlignment="Center"
                                                               HorizontalAlignment="Center" />
                                                    <ItemsControl ItemsSource="{Binding Days }">
                                                        <ItemsControl.ItemsPanel>
                                                            <ItemsPanelTemplate>
                                                                <StackPanel Orientation="Horizontal" />
                                                            </ItemsPanelTemplate>
                                                        </ItemsControl.ItemsPanel>
                                                        <ItemsControl.ItemTemplate>
                                                            <DataTemplate>
                                                                <Border BorderBrush="Black"
                                                                        Width="22"
                                                                        BorderThickness="0,1,1,1">
                                                                    <StackPanel Orientation="Vertical">
                                                                        <TextBlock Text="{Binding}"
                                                                                   HorizontalAlignment="Center" />
                                                                        <ToggleButton Width="22"
                                                                                      HorizontalAlignment="Center"
                                                                                      IsChecked="{Binding IsSelected,UpdateSourceTrigger=PropertyChanged}"
                                                                                      Command="{Binding DataContext.ToggleDateCommand,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}"
                                                                                      CommandParameter="{Binding Date}">
                                                                            <TextBlock Text="{Binding  Date, StringFormat='{}{0:dd}' }"
                                                                                       HorizontalAlignment="Center" />
                                                                        </ToggleButton>
                                                                    </StackPanel>
                                                                </Border>
                                                            </DataTemplate>
                                                        </ItemsControl.ItemTemplate>
                                                    </ItemsControl>

                                                </StackPanel>
                                                <!--</Border>-->
                                            </DataTemplate>
                                        </ItemsControl.ItemTemplate>
                                    </ItemsControl>
                                </StackPanel>
                                <!--Hotels Item Control-->
                                <!--Each Row-->
                                <ScrollViewer Grid.Row="1"
                                              Margin="0,-1,0,0"
                                              HorizontalAlignment="Left"
                                              VerticalAlignment="Top"
                                              VerticalScrollBarVisibility="Auto"
                                              HorizontalScrollBarVisibility="Disabled">
                                    <ItemsControl ItemsSource="{Binding FilteredPlanList}"
                                                  VerticalAlignment="Top">
                                        <ItemsControl.ItemsPanel>
                                            <ItemsPanelTemplate>
                                                <StackPanel Orientation="Vertical" />
                                            </ItemsPanelTemplate>
                                        </ItemsControl.ItemsPanel>
                                        <ItemsControl.ItemTemplate>
                                            <DataTemplate>
                                                <StackPanel Orientation="Horizontal">
                                                    <!--Each Hotel-->
                                                    <Border BorderBrush="Black"
                                                            Width="150"
                                                            BorderThickness="0,1,0,0"
                                                            HorizontalAlignment="Center">
                                                        <TextBlock Text="{Binding Name}"
                                                                   Padding="5,0,0,0"
                                                                   HorizontalAlignment="Left"
                                                                   VerticalAlignment="Center" />
                                                    </Border>
                                                    <!--Rooms Row-->
                                                    <ItemsControl ItemsSource="{Binding Rooms}"
                                                                  HorizontalAlignment="Left">
                                                        <ItemsControl.ItemsPanel>
                                                            <ItemsPanelTemplate>
                                                                <StackPanel Orientation="Vertical" />
                                                            </ItemsPanelTemplate>
                                                        </ItemsControl.ItemsPanel>
                                                        <ItemsControl.ItemTemplate>
                                                            <DataTemplate>
                                                                <!--Each Room Row-->
                                                                <StackPanel Orientation="Horizontal">
                                                                    <Border BorderBrush="Black"
                                                                            Width="109"
                                                                            BorderThickness="1,1,0,0"
                                                                            HorizontalAlignment="Center">
                                                                        <TextBlock Text="{Binding RoomType }"
                                                                                   Margin="0,1"
                                                                                   HorizontalAlignment="Center" />
                                                                    </Border>
                                                                    <!--Rectangles ItemSource-->
                                                                    <ItemsControl ItemsSource="{Binding BookedInfoList}"
                                                                                  HorizontalAlignment="Left">
                                                                        <ItemsControl.ItemsPanel>
                                                                            <ItemsPanelTemplate>
                                                                                <StackPanel Orientation="Horizontal" />
                                                                            </ItemsPanelTemplate>
                                                                        </ItemsControl.ItemsPanel>
                                                                        <ItemsControl.ItemTemplate>
                                                                            <DataTemplate>

                                                                                <Button Background="{Binding Converter={StaticResource BConverter}}"
                                                                                        HorizontalAlignment="Stretch"
                                                                                        Width="22"
                                                                                        ToolTipService.IsEnabled="{Binding Reservation,Converter={StaticResource ToolTipVis}}"
                                                                                        BorderBrush="{Binding IsDateSelected,Converter={StaticResource BoolToBorderColorConverter}}"
                                                                                        BorderThickness="1,0,0,1">
                                                                                    <Button.InputBindings>
                                                                                        <MouseBinding Gesture="LeftDoubleClick"
                                                                                                      Command="{  Binding DataContext.ViewReservationCommand,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}"
                                                                                                      CommandParameter="{Binding Reservation}" />
                                                                                    </Button.InputBindings>
                                                                                    <Button.ToolTip>
                                                                                        <StackPanel>
                                                                                            <Grid Margin="0,0,0,5"
                                                                                                  DataContext="{Binding Reservation}">
                                                                                                <Grid.RowDefinitions>
                                                                                                    <RowDefinition Height="Auto" />
                                                                                                    <RowDefinition Height="Auto" />
                                                                                                    <RowDefinition Height="Auto" />
                                                                                                    <RowDefinition Height="Auto" />
                                                                                                </Grid.RowDefinitions>
                                                                                                <Grid.ColumnDefinitions>
                                                                                                    <ColumnDefinition Width="170" />
                                                                                                    <ColumnDefinition Width="130" />
                                                                                                </Grid.ColumnDefinitions>
                                                                                                <!--Row 0-->
                                                                                                <Border BorderBrush="Black"
                                                                                                        Grid.Row="0"
                                                                                                        Grid.Column="0"
                                                                                                        HorizontalAlignment="Stretch"
                                                                                                        BorderThickness="1">
                                                                                                    <TextBlock Text="{Binding Dates}"
                                                                                                               VerticalAlignment="Center"
                                                                                                               HorizontalAlignment="Center"
                                                                                                               Margin="5,0" />
                                                                                                </Border>
                                                                                                <Border BorderBrush="Black"
                                                                                                        Grid.Row="0"
                                                                                                        HorizontalAlignment="Stretch"
                                                                                                        Grid.Column="1"
                                                                                                        BorderThickness="0,1,1,1"></Border>
                                                                                                <Border BorderBrush="Black"
                                                                                                        Grid.Row="1"
                                                                                                        Grid.Column="0"
                                                                                                        HorizontalAlignment="Stretch"
                                                                                                        BorderThickness="1,0,1,1">
                                                                                                    <TextBlock Margin="5,0"
                                                                                                               HorizontalAlignment="Center"
                                                                                                               Text="{Binding Room.Hotel}" />
                                                                                                </Border>
                                                                                                <Border BorderBrush="Black"
                                                                                                        Grid.Row="1"
                                                                                                        HorizontalAlignment="Stretch"
                                                                                                        Grid.Column="1"
                                                                                                        BorderThickness="0,0,1,1">
                                                                                                    <TextBlock Margin="5,0"
                                                                                                               HorizontalAlignment="Center"
                                                                                                               Text="{Binding Room.RoomType}" />
                                                                                                </Border>
                                                                                                <!--Row 2-->
                                                                                                <Border BorderBrush="Black"
                                                                                                        Grid.Row="2"
                                                                                                        Grid.Column="0"
                                                                                                        HorizontalAlignment="Stretch"
                                                                                                        Grid.ColumnSpan="2"
                                                                                                        BorderThickness="1,0,1,1">
                                                                                                    <TextBlock Text="{Binding Names}"
                                                                                                               Margin="5,0"
                                                                                                               FontSize="10"
                                                                                                               HorizontalAlignment="Left" />
                                                                                                </Border>
                                                                                            </Grid>
                                                                                        </StackPanel>
                                                                                    </Button.ToolTip>
                                                                                </Button>
                                                                                <!--</Border>
                                                                                </Border>-->
                                                                            </DataTemplate>
                                                                        </ItemsControl.ItemTemplate>
                                                                    </ItemsControl>
                                                                </StackPanel>
                                                            </DataTemplate>
                                                        </ItemsControl.ItemTemplate>
                                                    </ItemsControl>
                                                </StackPanel>
                                            </DataTemplate>
                                        </ItemsControl.ItemTemplate>
                                    </ItemsControl>
                                </ScrollViewer>
                            </Grid>
                        </Border>
                    </ScrollViewer>
...