Как создать пользовательский элемент управления WPF, который наследуется от сетки данных WPF - PullRequest
0 голосов
/ 11 мая 2018

У меня возникли проблемы с настраиваемым управлением WPF, которое наследуется от сетки данных WPF, и мне нужен совет.

Любая помощь будет оценена.

Я работаю с VS2015 и C # над приложением WPF, в котором я использую - среди стандартных элементов управления WPF - самодельные пользовательские элементы управления.

Теперь я хотел создать новый пользовательский элемент управления, который наследуется от сетки данных WPF, поэтому у меня есть возможность перезаписать событие OnItemsSourceChanged.

Пока я не использую явно определенные столбцы в сетке данных, все в порядке и выглядит как стандартная сетка данных WPF.

Но у меня есть несколько проблем.

Первые события, такие как SelectionChanged, больше не работают, потому что я не поднимаю событие из внутренней таблицы данных моего пользовательского элемента управления на родительский.

Как мне это сделать?

Далее я могу использовать явно определенные столбцы?

Вот несколько примеров определения пользовательского элемента управления и его использования в одном из моих окон WPF:

Сначала определение пользовательского элемента управления:

<Style TargetType="{x:Type local:CustomDataGrid}" BasedOn="{StaticResource {x:Type DataGrid}}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CustomDataGrid}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <DataGrid BorderThickness="{TemplateBinding BorderThickness}"
                              ColumnHeaderStyle="{TemplateBinding ColumnHeaderStyle}"
                              ItemsSource="{TemplateBinding ItemsSource}"
                              CanUserAddRows="{TemplateBinding CanUserAddRows}"
                              IsReadOnly="{TemplateBinding IsReadOnly}"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

И использование в одном из окон WPF. Обратите внимание, что один из моих коллег внедрил сеточный фильтр. Должен ли я наследовать фильтр как свойства родительской таблицы данных?

                    <CustomControls:CustomDataGrid x:Name="grdInputMasksList"
                          BorderThickness="0"
                          filter:DataGridExtensions.UseBackgroundWorkerForFiltering="True"
                          filter:DataGridExtensions.IsClearButtonVisible="False"
                          filter:DataGridExtensions.IsFilterVisible="True"
                          ColumnHeaderStyle="{StaticResource {ComponentResourceKey TypeInTargetAssembly={x:Type filter:DataGridHeaderFilterControl},ResourceId=DataGridHeaderFilterControlStyle}}"
                          ItemsSource="{Binding InputMasksListShortDetails}"
                          CanUserAddRows="False"
                          IsReadOnly="True"
                          AutoGenerateColumns="False"
                          SelectionChanged="grdInputMasksList_SelectionChanged"
                          MouseDoubleClick="grdInputMasksList_MouseDoubleClick">
                        <CustomControls:CustomDataGrid.Columns>
                            <DataGridTemplateColumn Header="TextDelete" filter:DataGridColumnExtensions.DoNotGenerateFilterControl="True">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <Button Name="btnRemoveInputMask"
                                        Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}"
                                        Width="30" Height="20" Focusable="False"
                                        CommandParameter="{Binding inputMaskId}"
                                        Click="btnRemoveInputMask_Click">
                                            <StackPanel Orientation="Horizontal">
                                                <Image Source="..\..\pictures\delete_blue.png"/>
                                            </StackPanel>
                                        </Button>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                            <DataGridTextColumn x:Name="colInputMaskName"
                                            Binding="{Binding Path=inputMaskName}"
                                            Header="TextInputMaskName"/>
                            <DataGridCheckBoxColumn x:Name="colIsReleased" 
                                                Binding="{Binding isReleasedBool}" 
                                                Header="TextIsReleasedShort"/>
                            <DataGridTextColumn x:Name="colInputMaskText"
                                            Binding="{Binding Path=text}"
                                            Header="TextPropertyDescriptionText"/>
                            <DataGridTextColumn x:Name="colInputMaskChanger"
                                            Binding="{Binding Path=changedBy}"
                                            Header="TextChangedBy"/>
                            <DataGridTextColumn x:Name="colInputMaskChangeDate"
                                            Binding="{Binding Path=changeDate, StringFormat='dd.MM.yyyy HH.mm'}"
                                            Header="TextChangeDate"/>
                        </CustomControls:CustomDataGrid.Columns>
                    </CustomControls:CustomDataGrid>
...