C# 使用C在WPF中编辑DataGridComboxColumn
我在运行时使用WPF DataGrid控件和动态列绑定。DataGrid列是动态的 示例代码如下所示 .xaml有以下代码C# 使用C在WPF中编辑DataGridComboxColumn,c#,wpf,datagrid,C#,Wpf,Datagrid,我在运行时使用WPF DataGrid控件和动态列绑定。DataGrid列是动态的 示例代码如下所示 .xaml有以下代码 <Style TargetType="ComboBox" x:Key="ComboBoxEditingStyle"> <Setter Property="ItemsSource" Value="{Binding Path=DefinedFormatters}" /> <Sette
<Style TargetType="ComboBox" x:Key="ComboBoxEditingStyle">
<Setter Property="ItemsSource" Value="{Binding Path=DefinedFormatters}" />
<Setter Property="IsDropDownOpen" Value="False" />
<Setter Property="IsEditable" Value="True" />
<Setter Property="SelectedValue" Value="Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="{Binding Path=Name}"></TextBlock>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
.xaml.cs文件包含以下代码
Binding theBinding = new Binding();
theBinding.Mode = BindingMode.TwoWay;
theBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
theBinding.ValidatesOnDataErrors = true;
DataGridComboBoxColumn colSuggestionList = new DataGridComboBoxColumn();
// theCollection is Collection<string>
colSuggestionList.ItemsSource = theCollection;
colSuggestionList.SelectedValueBinding = theBinding;
colSuggestionList.Visibility = Visibility.Visible;
colSuggestionList.EditingElementStyle = dgMainTemplate.FindResource("ComboBoxEditingStyle") as Style;
// dgMainTemplate is wpf DataGrid
dgMainTemplate.Columns.Add(colSuggestionList);
列已正确添加,但我希望将此列设置为可编辑。用户应该能够从可用列表中选择现有项或输入可用列表中不存在的新值。
这里EditingElementStyle将添加可编辑的组合框,但在用户选择任何项目之前,项目不会显示在组合框中。最后我得到了这个问题的解决方案,修改后的代码如下所示
<Style x:Key="TextBlockComboBoxStyle" TargetType="{x:Type ComboBox}" BasedOn="{StaticResource {x:Type ComboBox}}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ComboBox}">
<Label Content="{TemplateBinding Text}" Style="{StaticResource {x:Type Label}}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="ComboBox" x:Key="ComboBoxEditingStyle">
<Setter Property="ItemsSource" Value="{Binding Path=DefinedFormatters}" />
<Setter Property="IsDropDownOpen" Value="False" />
<Setter Property="IsEditable" Value="True" />
</Style>
.cs代码为
Binding theBinding = new Binding();
theBinding.Mode = BindingMode.TwoWay;
theBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
theBinding.ValidatesOnDataErrors = true;
DataGridComboBoxColumn colSuggestionList = new DataGridComboBoxColumn();
// theCollection is Collection<string>
colSuggestionList.ItemsSource = theCollection;
colSuggestionList.SelectedValueBinding = theBinding;
colSuggestionList.Visibility = Visibility.Visible;
colSuggestionList.EditingElementStyle = dgMainTemplate.FindResource("ComboBoxEditingStyle") as Style;
colSuggestionList.EditingElementStyle = dgMainTemplate.FindResource("ComboBoxEditingStyle") as Style;
colSuggestionList.ElementStyle = dgMainTemplate.FindResource("TextBlockComboBoxStyle") as Style;
// dgMainTemplate is wpf DataGrid
dgMainTemplate.Columns.Add(colSuggestionList);
没有直接的方法可以做到这一点。但您可以签出此链接。您应该使用DataGridTemplateColumn的CellTemplate和CellEditingTemplate允许用户在ComboBox中选择值或在TextBox中输入自由值。@user1672994在设计时很容易处理,但是,有可能在运行时动态添加列吗?使用DataGridTemplateColumn的CellTemplateRather,而不是像现在这样编写代码,建议这样做的方法是将xaml构建为字符串,然后将其解析到UI中。您可以为每个场景定义要使用的模板,并用字符串替换绑定变量、集合等。这不完全是您在这里要做的,我在编写这些模板时并没有考虑到这一点,因此这些示例只是为了说明方法,而不是剪切和粘贴。根据我的经验,在datagrid中编辑很少是一个好计划。几乎总是最好选择一行并在单独的面板中进行编辑,这样用户一次只能显式地处理一行。