Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在DataGrid内绑定多列组合框的选定值_C#_Wpf_Xaml_Datagrid_Combobox - Fatal编程技术网

C# 在DataGrid内绑定多列组合框的选定值

C# 在DataGrid内绑定多列组合框的选定值,c#,wpf,xaml,datagrid,combobox,C#,Wpf,Xaml,Datagrid,Combobox,工作示例: 我有一个名为“组”的表,如下所示: 看了上面的图片后,我想您可能已经理解了主键和外键存在于同一个表中。我认为这就是开发人员所说的循环引用 在MainWindow.xaml中,我有一个DataGrid,它包含三列,即组名、父名称和描述。xaml看起来像: <Window .......> <Window.DataContext> <self:MainWindowViewModel /> </Window.Da

工作示例:

我有一个名为“组”的表,如下所示:

看了上面的图片后,我想您可能已经理解了主键和外键存在于同一个表中。我认为这就是开发人员所说的循环引用

在MainWindow.xaml中,我有一个DataGrid,它包含三列,即组名、父名称和描述。xaml看起来像:

<Window .......>

    <Window.DataContext>
        <self:MainWindowViewModel />
    </Window.DataContext>

    <DataGrid ItemsSource="{Binding Groups}" TabIndex="1">

        <DataGrid.Columns>

            <DataGridTemplateColumn Header="Group Name" Width="2*">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding GroupName}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <TextBox Text="{Binding GroupName}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>

            <DataGridTemplateColumn Header="Parent" Width="2*">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding ParentID, Converter={StaticResource GroupIDToGroupNameConverter}}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <ComboBox ItemsSource="{Binding DataContext.GroupsCollection, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"
                                  SelectedValue="{Binding ParentID}"
                                  SelectedValuePath="GroupID"
                                  DisplayMemberPath="GroupName"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>

            <DataGridTemplateColumn Header="Description" Width="2*">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Description}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <TextBox Text="{Binding Description}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>

        </power:PowerDataGrid.Columns>

    </power:PowerDataGrid>

</Window>
在App.xaml中:

<self:GroupIDToGroupName x:Key="GroupIDToGroupNameConveerter" />
我的ViewModel中的更改:

我删除了属性GroupsCollection及其所有引用,并添加了一个名为GroupIDandNames的新属性,其相应效果如下:

private ObservableCollection<GroupIDAndNameWithCorrespondingEffect> _groupIDAndNamesWithCorrespondingEffects;
public ObservableCollection<GroupIDAndNameWithCorrespondingEffect> GroupIDAndNamesWithCorrespondingEffects
{
    get
    {
        return _groupIDAndNamesWithCorrespondingEffects;
    }
    set
    {
        _groupIDAndNamesWithCorrespondingEffects = value;
        OnPropertyChanged("GroupIDAndNamesWithCorrespondingEffects");
    }
}
private-observedcollection\u-groupid和具有相应效果的名称;
具有相应效果的公共可观测集合组ID和名称
{
得到
{
返回具有相应效果的组ID和名称;
}
设置
{
_groupID和名称及其对应的效果=值;
已更改的不动产(“具有相应影响的组ID和名称”);
}
}
在构造器中:

List<GroupIDAndNameWithCorrespondingEffect> _GroupIDAndNamesWithCorrespondingEffects = (
                                                                                                 from g in sampleDBContext.Groups
                                                                                                 select new GroupIDAndNameWithCorrespondingEffect
                                                                                                 {
                                                                                                     GroupID = g.GroupID,
                                                                                                     GroupName = g.GroupName,
                                                                                                     CorrespondingEffect = g.Effect.Effect1
                                                                                                 }
                                                                                             ).ToList();

            GroupIDAndNamesWithCorrespondingEffects
                = new ObservableCollection<GroupIDAndNameWithCorrespondingEffect>(
                                                                                _GroupIDAndNamesWithCorrespondingEffects.Where
                                                                                    (
                                                                                        u => !GetAllChildren(25)
                                                                                                .Select(x => x.GroupID)
                                                                                                .Contains(u.GroupID)
                                                                                    ).ToList()
                                                                            );
List\u groupId和名称及其相应的效果=(
来自sampleDBContext.Groups中的g
选择具有相应效果的新组ID和名称
{
GroupID=g.GroupID,
GroupName=g.GroupName,
对应效应=g.Effect.Effect1
}
).ToList();
具有相应效果的组ID和名称
=新的可观测集合(
_具有相应效果的组ID和名称。其中
(
u=>!GetAllChildren(25)
.Select(x=>x.GroupID)
.Contains(u.GroupID)
)托利斯先生()
);
在my Main Window.xaml中,我添加了一个资源,如下所示:

<Window.Resources>
    <CollectionViewSource x:Key="GroupNamesWithCorrespondingEffectsCollection" Source="{Binding GroupIDAndNamesWithCorrespondingEffects}" />    
</Window.Resources>

网格资源内部:

    <Grid.Resources>

        <CompositeCollection x:Key="Items">
            <ComboBoxItem IsEnabled="False" Background="#FF2A2A2A" Foreground="White">
                <Grid TextElement.FontWeight="Bold" >
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition SharedSizeGroup="A" />
                        <ColumnDefinition Width="50" />
                        <ColumnDefinition SharedSizeGroup="B" />
                    </Grid.ColumnDefinitions>
                    <Grid.Children>
                        <TextBlock Grid.Column="0" Text="Group Name" />
                        <TextBlock Grid.Column="2" Text="Effect" />
                    </Grid.Children>
                </Grid>
            </ComboBoxItem>
            <CollectionContainer Collection="{Binding Source={StaticResource GroupNamesWithCorrespondingEffectsCollection}}" />
        </CompositeCollection>

        <DataTemplate DataType="{x:Type self:GroupIDAndNameWithCorrespondingEffect}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition SharedSizeGroup="A" />
                    <ColumnDefinition Width="50" />
                    <ColumnDefinition SharedSizeGroup="B" />
                </Grid.ColumnDefinitions>
                <Grid.Children>
                    <TextBlock Grid.Column="0" Text="{Binding GroupName}" />
                    <TextBlock Grid.Column="2" Text="{Binding CorrespondingEffect}" />
                </Grid.Children>
            </Grid>
        </DataTemplate>

    </Grid.Resources>

我将ComboBox的ItemsSource更改为ItemsSource=“{DynamicResource Items}”

问题:

当我运行程序时,组合框会正确显示所有项目。此外,还会显示两列标题。它工作正常,但当我按Enter或TAB键时,焦点仍保留在同一单元格中,组合框的文本显示GroupID和Names的名称空间,并具有相应的效果

以下是问题的图像:

示例:


如果有人想检查样品,那么它是可用的。和数据库文件可用。

可能。。。也许您的组合框只需要IsEditable=false。IsEditable=True使组合框显示名称空间而不是文本。

解决此问题的一种方法是

另一种方法是向ComboBox的ItemTemplate提供一个DataTemplate

<ComboBox ItemTemplate="{StaticResource myDataTemplate}"/>

明白了

我在网格中用
key=“Items”
声明了资源。因此,当我在DataGrid的
PreviewKeyDown
事件中选中
ComboBox.SelectedIndex时,它会给我
-1
,因此我的逻辑工作起来出乎意料。而且,此时我得到了
ComboBox.Items.Count=0

所以我只是改变了资源声明的位置。我的意思是我删除了
Grid.Resources部分
,在
ComboBox.Resources部分
我写了相同的代码。现在它运行良好。现在在DataGrid的
PreviewKeyDown中,我得到了组合框
的预期
SelectedIndex,以及
ComboBox.Items.Count等于源代码中的计数


我不知道为什么会这样?因为我已经将它用作
DynamicResource
我希望它能够工作,即使它是在Grid.Resources部分声明的。

但是我需要combobox的IsEditable行为为true。如果需要IsEditable=true,那么可能会将要显示的文本放在带有Textsearch的comboboxitem标记内。text可能会这样做:。这必须与comboboxitem中的“内部”文本完全相同。我100%确定我的绑定需要更改。但我不知道要绑定的模型的正确属性。它不能是相同的文本。它可以是任何文本,它将被显示,我发现。对不起。。。我无法理解您的上述评论。由于此处没有SQL server,我无法运行提供的示例。你能提供一份
<Window.Resources>
    <CollectionViewSource x:Key="GroupNamesWithCorrespondingEffectsCollection" Source="{Binding GroupIDAndNamesWithCorrespondingEffects}" />    
</Window.Resources>
    <Grid.Resources>

        <CompositeCollection x:Key="Items">
            <ComboBoxItem IsEnabled="False" Background="#FF2A2A2A" Foreground="White">
                <Grid TextElement.FontWeight="Bold" >
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition SharedSizeGroup="A" />
                        <ColumnDefinition Width="50" />
                        <ColumnDefinition SharedSizeGroup="B" />
                    </Grid.ColumnDefinitions>
                    <Grid.Children>
                        <TextBlock Grid.Column="0" Text="Group Name" />
                        <TextBlock Grid.Column="2" Text="Effect" />
                    </Grid.Children>
                </Grid>
            </ComboBoxItem>
            <CollectionContainer Collection="{Binding Source={StaticResource GroupNamesWithCorrespondingEffectsCollection}}" />
        </CompositeCollection>

        <DataTemplate DataType="{x:Type self:GroupIDAndNameWithCorrespondingEffect}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition SharedSizeGroup="A" />
                    <ColumnDefinition Width="50" />
                    <ColumnDefinition SharedSizeGroup="B" />
                </Grid.ColumnDefinitions>
                <Grid.Children>
                    <TextBlock Grid.Column="0" Text="{Binding GroupName}" />
                    <TextBlock Grid.Column="2" Text="{Binding CorrespondingEffect}" />
                </Grid.Children>
            </Grid>
        </DataTemplate>

    </Grid.Resources>
TextSearch.TextPath="GroupName"
<ComboBox ItemTemplate="{StaticResource myDataTemplate}"/>