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