简体   繁体   English

如何使DataGrid行中的ComboBox唯一?

[英]How can I make a ComboBox in a DataGrid row unique?

Environment for the following question: C#, WPF, XAML 以下问题的环境:C#,WPF,XAML

How can I achieve to setup a table/a DataGrid with an undefined number of rows having a Combobox in an arbitrary column (number of columns is undefined as well)? 如何实现设置表/数据网格的行数未定义且任意列中有组合框(列数也未定义)? (The other row's cells will be filled with the properties of the underyling object/entity.) The ComboBoxes shall all have the same items but the selected item shall be assigned to the underlying object of the row (of course). (另一行的单元格将填充底层对象/实体的属性。)ComboBox都应具有相同的项目,但所选的项目应(当然)分配给该行的基础对象。 Hence, I think the ComboBox of each row must have a unique identifier. 因此,我认为每行的ComboBox必须具有唯一的标识符。 The selected item shall be stored in a property of the underlying object/entity. 所选项目应存储在基础对象/实体的属性中。

By the way: The ComboBox shall be filled with items of a collection (List) that is not part of the row's underlying object/entity. 顺便说一句:组合框应填充不属于该行的基础对象/实体的集合(列表)的项目。

What would be the best way using WPF / XAML? 使用WPF / XAML的最佳方法是什么?

UPDATE (2018-12-14): 更新(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>

It is happening because you are using the same collection for the Combo-Box in each row. 发生这种情况的原因是,您为每一行中的组合框使用了相同的集合。 The ItemsSource for the Combo-Box should be a collection and it should be a member/property of class that set as DataContext for the DataGrid. 组合框的ItemsSource应该是一个集合,并且应该是设置为DataGrid的DataContext的类的成员/属性。

Or 要么

Bind the SelectedItem property of Combo-Box to a member of your class. 将Combo-Box的SelectedItem属性绑定到您的类的成员。 See https://www.c-sharpcorner.com/uploadfile/dpatra/combobox-in-datagrid-in-wpf/ 参见https://www.c-sharpcorner.com/uploadfile/dpatra/combobox-in-datagrid-in-wpf/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 当ItemsSource为空时,如何确保WPF DataGrid至少显示一行? (可编辑的ComboBox单元格) - How can I make sure my WPF DataGrid shows at least one row when ItemsSource is empty? (Editable ComboBox cells) 如何在DataGrid WPF桌面应用程序中进行行分组 - How I can make Row Grouping in DataGrid WPF Desktop Application 当我在WPF中选择一行数据网格时,如何在组合框中显示一个值? - How to show a value in combobox when i select a row of datagrid in wpf? 如何将 Windows 社区模板数据网格的数据项行上的集合用作同一行上 ComboBox 列的项源? - How can I use a collection on the data item row of my Windows Community Template datagrid as the Itemsource for a ComboBox column on the same row? 如何从 DataGrid 将数据绑定到 ComboBox 内部? - How can I bind data to a ComboBox inside from DataGrid? 如何在 datagrid WPF 中获取行? - How can I get row in datagrid WPF? 如何在wpf中向datagrid添加行? - How can I add row to datagrid in wpf? 如何在WPF中制作可编辑的DataGrid? - How can I make an editable DataGrid in WPF? WPF DataGrid - 从 DataGrid ItemsSource 对象的集合值中设置每行(对象)唯一的 combobox 值 - WPF DataGrid - Set unique per row (object) combobox values from the DataGrid ItemsSource object's collection value 如何使选定的行在未聚焦的数据网格中突出显示? - How do I make the selected row highlighted in an unfocused datagrid?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM