Как сделать ComboBox в строке DataGrid уникальным? - PullRequest
0 голосов
/ 14 декабря 2018

Среда для следующего вопроса: C #, WPF, XAML

Как мне настроить таблицу / DataGrid с неопределенным числом строк, имеющих комбинированный список в произвольном столбце (количество столбцов не определенотакже)?(Ячейки другой строки будут заполнены свойствами объекта / объекта нижележащего типа.) Все поля со списками должны иметь одинаковые элементы, но выбранный элемент должен быть назначен базовому объекту строки (конечно).Следовательно, я думаю, что ComboBox каждой строки должен иметь уникальный идентификатор.Выбранный элемент должен храниться в свойстве базового объекта / объекта.

Кстати: ComboBox должен быть заполнен элементами коллекции (List), которая не является частью базового объекта / объекта строки.

Как лучше всего использовать WPF / XAML?

ОБНОВЛЕНИЕ (2018-12-14):

    <Window x:Class="ConfigTool.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ConfigTool"
        xmlns:lb="clr-namespace:ConfigTool.DataBinding"
        mc:Ignorable="d"
        Title="xxx" Height="650" Width="1200" Closing="CloseWindow">

    <Window.Resources>
        <CollectionViewSource x:Key="TagsCollectionViewSource" CollectionViewType="ListCollectionView"/>
        <CollectionViewSource x:Key="NotificationsCollectionViewSource" CollectionViewType="ListCollectionView"/>
        <CollectionViewSource x:Key="TagNamesCollectionViewSource" CollectionViewType="ListCollectionView"/>

        <lb:StringListConverter x:Key="StringListConverter" />
    </Window.Resources>

    <Grid Margin="10,10,10,10">
        <TabControl>
            <TabItem Header="Tags">
                <ScrollViewer HorizontalScrollBarVisibility="Auto">
                    <DataGrid x:Name="tagsGrid" DataContext="{StaticResource TagsCollectionViewSource}" ItemsSource="{Binding}" 
                              AlternatingRowBackground="LightBlue" AutoGenerateColumns="False" CanUserAddRows="True" IsReadOnly="False" 
                              SelectionMode="Single" BorderBrush="Magenta" BorderThickness="3">
                        <DataGrid.Columns>
                            <DataGridTextColumn x:Name="TagName" Header="Tag name" Binding="{Binding Mode=TwoWay, Path=TagName}"></DataGridTextColumn>
                            <DataGridTextColumn Header="Cycle" Binding="{Binding Mode=TwoWay, Path=Cycle}"></DataGridTextColumn>
                            <DataGridTextColumn Header="Source" Binding="{Binding Mode=TwoWay, Path=Source}"></DataGridTextColumn>
                            <DataGridTemplateColumn x:Name="editTagColumn" Header="Edit">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <WrapPanel>
                                            <Button x:Name="btnTagDelete" Click="BtnTagDelete_Click" CommandParameter="{Binding}" Height="15" Width="15" Margin="2">
                                                <Button.Content>
                                                    <Image Source="Resources/delete.png"></Image>
                                                </Button.Content>
                                            </Button>
                                        </WrapPanel>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                        </DataGrid.Columns>
                    </DataGrid>
                </ScrollViewer>
            </TabItem>
            <TabItem Header="Notifications">
                <ScrollViewer HorizontalScrollBarVisibility="Auto">
                    <DataGrid x:Name="notificationsGrid" DataContext="{StaticResource NotificationsCollectionViewSource}" ItemsSource="{Binding}" 
                              AlternatingRowBackground="LightBlue" AutoGenerateColumns="False" CanUserAddRows="True" IsReadOnly="False" 
                              SelectionMode="Single" BorderBrush="Magenta" BorderThickness="3">
                        <DataGrid.Columns>
                            <!--<DataGridTextColumn Header="Tag name" Binding="{Binding Mode=TwoWay, Path=TagName}"></DataGridTextColumn>-->
                            <DataGridTemplateColumn x:Name="tagNameColumn" Header="Tag name">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <!--<ItemContainerTemplate>
                                        <StackPanel>-->
                                            <!--DataContext="{Binding Source={StaticResource TagNamesCollectionViewSource}}">-->
                                            <!--<ComboBox Width="200" DataContext="{StaticResource TagNamesCollectionViewSource}" ItemsSource="{Binding TagNames, Converter={StaticResource StringListConverter}}">-->
                                        <ComboBox Name="notificationTagName" Width="200" DataContext="{StaticResource TagNamesCollectionViewSource}" ItemsSource="{Binding Source={StaticResource TagNamesCollectionViewSource}, RelativeSource={RelativeSource AncestorType=local:MainWindow}}" 
                                                  SelectionChanged="notificationTagName_SelectionChanged" />
                                            <!--<ComboBox Width="200" DataContext="{StaticResource TagNamesCollectionViewSource}" ItemsSource="{Binding Converter={StaticResource StringListConverter}}" />-->
                                            <!--<ComboBox Width="200" ItemsSource="{Binding ElementName=Window2, Path=DataContext.TagNames, Converter={StaticResource StringListConverter}}" />-->
                                            <!--<ComboBox HorizontalAlignment="Left" Margin="256,260,0,0" VerticalAlignment="Top" Width="120" x:Name="DataList" ItemsSource="{Binding DetailParams, Converter={StaticResource StringListConverter}}"/>-->
                                    </DataTemplate>
                                    <!--</StackPanel>
                                    </ItemContainerTemplate>-->
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                            <DataGridCheckBoxColumn Header="IsActive" Binding="{Binding Mode=TwoWay, Path=IsActive}"></DataGridCheckBoxColumn>
                            <DataGridTextColumn Header="Type" Binding="{Binding Mode=TwoWay, Path=Type}"></DataGridTextColumn>
                            <DataGridTextColumn Header="Limit" Binding="{Binding Mode=TwoWay, Path=Limit}"></DataGridTextColumn>
                            <DataGridTextColumn Header="DetailTemplate" Binding="{Binding Mode=TwoWay, Path=DetailTemplate}"></DataGridTextColumn>
                            <!--<DataGridTextColumn Header="DetailParams" Binding="{Binding Mode=TwoWay, Path=DetailParams, Converter={StaticResource StringListConverter}}"></DataGridTextColumn>-->
                            <DataGridTemplateColumn x:Name="detailsParamColumn" Header="Edit">
                                <DataGridTemplateColumn.CellTemplate>
                                    <ItemContainerTemplate>
                                        <StackPanel> <!--DataContext="{Binding Source={StaticResource TagNamesCollectionViewSource}}">-->
                                            <!--<ComboBox Width="200" DataContext="{StaticResource TagNamesCollectionViewSource}" ItemsSource="{Binding TagNames, Converter={StaticResource StringListConverter}}">-->
                                            <ComboBox Width="200" DataContext="{StaticResource TagNamesCollectionViewSource}" ItemsSource="{Binding}" />
                                            <!--<ComboBox Width="200" DataContext="{StaticResource TagNamesCollectionViewSource}" ItemsSource="{Binding Converter={StaticResource StringListConverter}}" />-->
                                            <!--<ComboBox Width="200" ItemsSource="{Binding ElementName=Window2, Path=DataContext.TagNames, Converter={StaticResource StringListConverter}}" />-->
                                            <!--<ComboBox HorizontalAlignment="Left" Margin="256,260,0,0" VerticalAlignment="Top" Width="120" x:Name="DataList" ItemsSource="{Binding DetailParams, Converter={StaticResource StringListConverter}}"/>-->
                                        </StackPanel>
                                    </ItemContainerTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                            <DataGridTextColumn Header="CauseProbability" Binding="{Binding Mode=TwoWay, Path=CauseProbability, Converter={StaticResource StringListConverter}}"></DataGridTextColumn>
                            <DataGridTemplateColumn x:Name="editNotificationsColumn" Header="Edit">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <WrapPanel>
                                            <Button x:Name="btnNotificationDelete" Click="BtnNotificationDelete_Click" Height="15" Width="15" Margin="2">
                                                <Image Source="Resources/delete.png"></Image>
                                            </Button>
                                        </WrapPanel>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                        </DataGrid.Columns>
                    </DataGrid>
                </ScrollViewer>
            </TabItem>
        </TabControl>
    </Grid>
</Window>

1 Ответ

0 голосов
/ 18 декабря 2018

Это происходит потому, что вы используете одну и ту же коллекцию для комбинированного списка в каждом ряду.ItemsSource для поля со списком должен быть коллекцией, и он должен быть членом / свойством класса, установленным как DataContext для DataGrid.

или

ПривязатьSelectedItem свойство Combo-Box для члена вашего класса.См. https://www.c -sharpcorner.com / uploadfile / dpatra / combobox-in-datagrid-in-wpf /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...