如何从数据网格组合框列中获取所选项目的值

4

我有一个数据网格,其中包括一个文本列和一个组合框列。

数据网格列如下:

<DataGrid.Columns>
    <DataGridTextColumn Header="ID"  
                        Binding="{Binding ID}" 
                        Width="0.5*" />
    <DataGridComboBoxColumn Header="Threshold"  
                            x:Name="Threshold" 
                            SelectedItemBinding="{SelectedValue}"/>
</DataGrid.Columns>

对于ComboBox列,我使用列表作为ItemSource。

Threshold.ItemsSource = MaxThreshold; //MaxThreshold is a List

所以每一行都有一个下拉框,包含了列表值。

用户选择特定的行,然后选择该行中的组合框。我想在C#中获取所选组合框中的项目值。

谢谢。


你是否遵循MVVM的概念?也就是说,你是否有一个代表DataGrid中项目的类? - keymusicman
我有一个针对我的DataGrid中项目的类。接着,我将它们制作成列表,并将其作为ItemSource提供给ComboBox。 - Abhishek
所以,你的类中有SelectedValue属性,对吗?为什么不能从你的DataGrid中取出SelectedItem或SelectedItems,将其转换为你的类型,然后从中获取SelectedValue呢? - keymusicman
3个回答

5
为了完成您想要的工作,您首先需要一个“数据模型”,也就是说,在您的情况下,该模型必须包含两个“属性”,并且该模型实现了“INotifyPropertyChanged”接口,以通知“UI”属性值已更改。以下是适合您示例的“模型”,我称之为“我的模型”:
public class MyModel: INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private object _id;
        public object ID 
        {
            get { return _id; }
            set 
            { 
                _id = value;
                this.OnPropertyChanged(new PropertyChangedEventArgs("ID"));
            }
        }

        private object _selectedItem;
        public object SelectedItem
        {
            get { return _selectedItem; }
            set
            {
                _selectedItem = value;
                this.OnPropertyChanged(new PropertyChangedEventArgs("SelectedItem"));
            }
        }

        public virtual void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, e);
        }
    }

注意:您必须根据需要更改属性和属性类型。

您的DataGrid应该像下面展示的XAML一样(填充DataGridComboBox属性window.cs文件中):

<DataGrid x:Name="myDataGrid" AutoGenerateColumns="False" 
                  ItemsSource="{Binding MyDataGridItems,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}">
            <DataGrid.Columns >
                <DataGridTextColumn Header="   ID"  
                        Binding="{Binding ID}" 
                        Width="0.5*" />
                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox x:Name="Threshold" 
                                      SelectedItem="{Binding SelectedItem, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
                                      ItemsSource="{Binding MaxThreshold,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

Window .cs 文件 中,我们有以下代码片段:
 public List<MyModel> MyDataGridItems { get; set; }
 public List<object> MaxThreshold { get; set; }

在Window的构造函数中,您可以初始化列表:
myDataGridItems = new List<MyModel>()
{
      new MyModel(){ID=1},
      new MyModel(){ID=2},
      new MyModel(){ID=3},
      new MyModel(){ID=4},
      new MyModel(){ID=5},
};

MaxThreshold = new List<object>()
{
    "Item 1",
    "Item 2",
    "Item 3",
    "Item 4",
    "Item 5"
};

要在DataGrid的特定行中选择combobox的选定项,您可以遍历DataGrid的项目或直接访问所需的行,例如:

var selectedValue = datagrid.getItemAt(rowIndex).combobox.selectedItem;

//iterate rows
foreach(MyModel model in myDataGrid.Items)
{
    var selecteditem = model.SelectedItem;//here you have selected item
}

//access directly
var model = myDataGrid.Items[0] as MyModel;
if(model!=null)
   var selecteditem = model.SelectedItem;//here you have selected item

1
这是我的例子:

XAML 代码:

<DataGrid.Columns>
  <DataGridTextColumn Binding="{Binding FeatureName}" />
  <DataGridCheckBoxColumn  Binding="{Binding FeatureExists}" />
  <DataGridComboBoxColumn DisplayMemberPath="MachineID" SelectedItemBinding="{Binding SelectedMchn}">
     <DataGridComboBoxColumn.ElementStyle>
        <Style>
          <Setter Property="ComboBox.ItemsSource" Value="{Binding Path=FeatureMachines}" />
        </Style>
     </DataGridComboBoxColumn.ElementStyle>
     <DataGridComboBoxColumn.EditingElementStyle>
        <Style>
           <Setter Property="ComboBox.ItemsSource" Value="{Binding Path=FeatureMachines}" />
        </Style>
      </DataGridComboBoxColumn.EditingElementStyle>
   </DataGridComboBoxColumn>                                

在代码后台中,我有一个属性:
private ObservableCollection<DGFeature> _BarDetail;
    public ObservableCollection<DGFeature> BarDetail
    {
        get { return _BarDetail; }
        set
        {
            if (_BarDetail != value)
            {
                _BarDetail = value;
                OnPropertyChanged("BarDetail");
            }
        }
    }

我已经创建了一个用于填充数据表格的类:

  public class DGFeature
{
    public string FeatureName { get; set; }
    public bool FeatureExists { get; set; }
    public List<LibTrackingSystem.Machine> FeatureMachines { get; set; }
    public LibTrackingSystem.Machine SelectedMchn { get; set; }
    public DGFeature()
    {
        FeatureMachines = new List<LibTrackingSystem.Machine>();
        SelectedMchn = new LibTrackingSystem.Machine();
    }
}

SelectedMchn 用于设置组合框中的选定项


0

也可以试试这个:

    // Mit Anwahl der Combobox Verfahrensart wird
    // die die Auswahl der Scopes entsprechend eingeschränkt
    private void DgrAuditorenScopes_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
    {
        int LiVerfahrensArtId;
        //int LiOk = 0;

        // gewählten Datensatz ermitteln
        if (DgrAuditorenScopes.SelectedIndex >= 0)
        {
            int x = e.Column.DisplayIndex;
            int y = e.Row.GetIndex();

            if (x == 0)     // Verfahrensart wurde gewählt
            {
                // string lsText = GetCurrentCellValue((ComboBox)e.EditingElement);
                LiVerfahrensArtId = int.Parse(GetCurrentValue((ComboBox)e.EditingElement));
            }
        }
    }

    // Little Help to convert cellValues
    private string GetCurrentValue(ComboBox txtCurCell)
    {
        return txtCurCell.SelectedValue.ToString();
    }

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接