如何在WPF中从数据网格中获取组合框的数据?

4

我一直在寻找一种方法来从我创建的数据网格组合框中获取数据。具体来说,是每个列中组合框的选定值。我对WPF还很陌生,如果有人能帮忙,我将不胜感激。

谢谢

XAML:

<DataGrid x:Name="tb" Margin="5,51,5,5" ItemsSource="{Binding}"         AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
            <DataGridCheckBoxColumn Header="Include" Binding="{Binding Include}"/>
            <DataGridTemplateColumn Header="Measure" Width="*">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox Margin="2" ItemsSource="{Binding Measure}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

C#:

ObservableCollection<State> items = new ObservableCollection<State>();
        foreach (string col in columns)
        {
            items.Add(new State()
            {
                Name = col,
                Include = true,
                Measure = new ObservableCollection<string>() { "Sum", "Average" }
            });
        }
        DataContext = items;

这是一张列的图片:


1
你需要ComboBox项目的目的是什么?在WPF中,我们使用绑定,这样你就永远不必从视图中获取任何东西。顺便问一下,为什么不使用DataGridComboBoxColumn呢? - Sinatr
没有特别的理由要使用组合框。我只需要像下拉框一样从用户获取特定列的输入。在这种情况下,你如何使用DataGridComboBoxColumn? - Maikool
1个回答

2

我认为你可能有些混淆了。我猜想你希望你的状态项具有一个字符串度量属性,而不是一组度量属性,但是你希望能够从一个带有多个选项的组合框中选择度量值...

如果是这种情况,那么你应该重新定义你的度量属性为单个字符串,而不是集合。

ObservableCollection<State> items = new ObservableCollection<State>();
    foreach (string col in columns)
    {
        items.Add(new State()
        {
            Name = col,
            Include = true,
            Measure = string.Empty  // Initialize it to whatever you want
        });
    }
    DataContext = items;

然后在您的DataContext中的其他位置创建Measure值集合,或者如果除了您的集合之外没有DataContext,可以在XAML中定义它。

最后,在DataGrid中,您必须绑定Combos的ItemsSource和SelectedItem属性。它们将共享相同的ItemsSource,该ItemsSource必须从您放置集合的位置获取,而不是行的DataContext:

<DataGrid x:Name="tb" Margin="5,51,5,5" ItemsSource="{Binding}"
          AutoGenerateColumns="False">
    <DataGrid.Resources>
        <!-- This is where the values are defined -->
        <col:ArrayList x:Key="MeasureValues">
            <sys:String>Sum</sys:String>
            <sys:String>Average</sys:String>
        </col:ArrayList>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
        <DataGridCheckBoxColumn Header="Include" Binding="{Binding Include}"/>
        <DataGridTemplateColumn Header="Measure" Width="*">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox Margin="2"
                              SelectedItem="{Binding Measure}"
                              ItemsSource="{StaticResource MeasureValues}" />
                              <!-- And this is where you consume those values -->
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

如果您不想在XAML中输入这些值,则需要在另一个DataContext中定义集合,并以某种方式创建Binding(使用RelativeSource、ElementName等)。

当然,这也适用于:

<DataGrid x:Name="tb" Margin="5,51,5,5" ItemsSource="{Binding}"
          AutoGenerateColumns="False">
    <DataGrid.Resources>
        <!-- This is where the values are defined -->
        <col:ArrayList x:Key="MeasureValues">
            <sys:String>Sum</sys:String>
            <sys:String>Average</sys:String>
        </col:ArrayList>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
        <DataGridCheckBoxColumn Header="Include" Binding="{Binding Include}"/>
        <DataGridComboBoxColumn Header="Measure" Width="*"
                                SelectedItemBinding="{Binding Measure}"
                                ItemsSource="{StaticResource MeasureValues}" />
                                <!-- And this is where you consume those values -->
    </DataGrid.Columns>
</DataGrid>

嗯,我刚看到你正在使用项集合作为DataContext...我会编辑我的答案。 - almulo
谢谢回复!你能否展示一下实际数据提取的例子吗?我对这个有点懵。 - Maikool
在我的示例中,由于在XAML中定义了Measure值集合,因此它应该可以正常工作,就像我写的那样。或者你想使用数据绑定吗? - almulo
我会编辑答案,将集合包含在DataGrid代码片段中,以使其更清晰。 - almulo

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