如何使用GridViewComboBoxColumn并允许用户编辑?

Elh*_*far 2 wpf xaml gridview wpfdatagrid

我需要提供一个WPF GridView,其中一列是a Combobox,用户可以从列表中选择一个值或输入一个新值,所以我设置IsComboBoxEditabletrue但问题是如果用户键入的值不在ItemsSourceText中Combobox失去焦点时空白.

注意:我不希望在键入新值时,将此值添加到ItemsSource.我只需要将它的string值保存在与它有界的行中.

我还需要DropDownOpened事件来填充它的ItemsSource.

这是我的代码:

<telerik:GridViewDataColumn Header="Description">
    <telerik:GridViewDataColumn.CellTemplate>
        <DataTemplate>
            <telerik:RadComboBox IsEditable="True" ItemsSource="{Binding Descriptions}" Text="{Binding Description1,Mode=TwoWay}" DropDownOpened="descriptionRadComboBox_DropDownOpened"/>
        </DataTemplate>
    </telerik:GridViewDataColumn.CellTemplate>
</telerik:GridViewDataColumn>
Run Code Online (Sandbox Code Playgroud)

Description1string属性,Descriptionsstring运行时填充的列表.(当DropDownOpened事件发生时)

Zah*_*yat 7

就像你提到的那样,你的目标只是"可编辑的ComboBox".(当然,你不想添加新的项目ItemsSource)

<telerik:GridViewDataColumn UniqueName="description1"  Header="Description">
    <telerik:GridViewDataColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Description1}"></TextBlock>
        </DataTemplate>
    </telerik:GridViewDataColumn.CellTemplate>
    <telerik:GridViewDataColumn.CellEditTemplate>
        <DataTemplate>
            <telerik:RadComboBox Name="SLStandardDescriptionsRadComboBox" IsEditable="True" 
                                                         ItemsSource="{Binding DataContext.SLStandardDescriptions, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" 
                                                        DisplayMemberPath="SLStandardDescriptionTitle" DropDownOpened="Description_DropDownOpened">
            </telerik:RadComboBox>
        </DataTemplate>
    </telerik:GridViewDataColumn.CellEditTemplate>

</telerik:GridViewDataColumn>
Run Code Online (Sandbox Code Playgroud)

Codebehinde:

private void RadGridView_CellEditEnded(object sender, GridViewCellEditEndedEventArgs e)
{
    if (e.Cell.Column.UniqueName == "description1")
    {
        RadComboBox combo = e.Cell.ChildrenOfType<RadComboBox>().FirstOrDefault();
        if (combo != null)
        {
            List<Description> comboItems = combo.ItemsSource as List<Description>;

            string textEntered = e.Cell.ChildrenOfType<RadComboBox>().First().Text;

            bool result = comboItems.Contains(comboItems.Where(x => x.DescriptionTitle == textEntered).FirstOrDefault());
            if (!result)
            {
                comboItems.Add(new Description { DescriptionTitle = textEntered });
                combo.SelectedItem = new Description { DescriptionTitle = textEntered };
            }
            if (_viewModel.AccDocumentItem != null)
            {
                if (e.Cell.Column.UniqueName == "description1")
                    _viewModel.AccDocumentItem.Description1 = textEntered;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)