数据网格(DataGrid):如何操纵选定的项目

3

这应该很简单,但我所有的搜索结果都是基于绑定的解决方案,而这不是我的情况。

我有一个 DataGrid,其中有一个 DataGridComboBoxColumn。这个列的 ItemsSource 属性绑定到一个字符串数组。在启动时,我使用循环通过以下代码为我的 DataGrid 的每一行设置此列的 SelectedItem

for (int i = 0; i < dgResults.Items.Count; i++)
{
    var x = dgResults.GetCell(i, 0).Content as System.Windows.Controls.ComboBox;
    x.SelectedItem = "One of the items of my array";
}                
GetCell()是我从这里获取的扩展方法。
现在的问题是,当我点击该列中的特定单元格时,在单元格中会出现下拉菜单,并且所有的数组项目都已正确填充到下拉菜单中,但是下拉菜单的当前文本为空,即它不会自动选择相应的下拉菜单项目。我漏掉了什么? 编辑 这是我DataGrid的相关部分:
<DataGrid x:Name="dgResults" AutoGenerateColumns="False" >
    <DataGrid.Columns>
        <DataGridComboBoxColumn ItemsSource="{StaticResource ReminderValues }" />
    </DataGrid.Columns>
</DataGrid>

如您所见,这个特定的列没有绑定到底层的DataColumn或其他东西,尽管整个DataGrid绑定到一个DataTable。此外,我可以确定这不是一个拼写错误。

如果您展示相关的XAML代码,将会很有帮助。我猜想您应该为SelectedItem创建一个绑定,而不是像您现在试图做的那样手动设置它。 - MBender
我更新了我的问题并添加了更多信息,请查看。 - dotNET
@dotNET 希望我的回答对您有用。 - WiiMaxx
3个回答

1

在睡眠一段时间后,我终于想通了。如果你的表格中有一个未绑定到基础数据源列的UNBOUND DataGridComboBoxColumn,且其ItemsSource属性绑定到一个数组或其他东西,你必须在DataGrid声明中添加以下内容:

SelectedItemBinding="{Binding /}"

上面的斜杠字符 (/) 代表当前项本身,这就是我们希望 SelectedItem 成为的内容。

现在我的 DataGrid 正确显示值,一旦单元格获得焦点,ComboBox 就会出现,并选择正确的值。


0

为了测试您的代码示例是否有效,请尝试将其更改为以下内容并运行您的应用程序:

for (int i = 0; i < dgResults.Items.Count; i++)
{
    var x = dgResults.GetCell(i, 0).Content as System.Windows.Controls.ComboBox;
    x.SelectedIndex = comboBoxItemsSource.Items.Count - 1;
}

如果所有的ComboBox都选择了最后一个选项,那么这段代码就可以正常工作。否则,你就会出现问题。如果它能够正常工作,问题可能是你在Items集合中没有精确匹配想要选择的string...记住,即使一个字符大小写不对,它也不会匹配,因此不会被选择。
如果上面的代码无法正常工作,那么也许你需要进一步测试你的GetCell方法...你是否在这个for循环中设置了断点来验证x是否为正确的单元格?

你是真的想在上面写 dgResults.Items.Count - 1 吗? - dotNET
是的...我为什么不会这么想呢?我将“SelectedIndex”设置为最后一项的索引进行测试,因为这将消除问题作者在设置“SelectedItem”属性时错配“string”的可能性。 - Sheridan
嗯...dgResult.Items.Count可能是一个很大的数字(显示在网格中的记录数),而我的ComboBox只有十几个项目。 - dotNET
哦,我明白了...在这种情况下,不,我不是想使用那个集合...我想使用你的ComboBox中的string值集合。 - Sheridan

0

如果你不介意另一个强制转换,你可以这样做

for (int i = 0; i < dgResults.Items.Count; i++)
{
    var x = dgResults.GetCell(i, 0).Content as System.Windows.Controls.ComboBox;

    var array = x.ItemsSource as string[] ;
    x.SelectedItem = array.Where(s => s == "B").FirstOrDefault();
}

编辑: 好的,现在应该可以了

工作示例: XAML

<Window x:Class="simpletest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <x:Array x:Key="ReminderValues" Type="sys:String">
            <sys:String>A</sys:String>
            <sys:String>B</sys:String>
            <sys:String>C</sys:String>
            <sys:String>D</sys:String>
        </x:Array>
        <x:Array x:Key="count" Type="sys:String">
            <sys:String>A</sys:String>
        </x:Array>
    </Window.Resources>
    <Grid>
        <DataGrid Name="dgResults" ItemsSource="{StaticResource count}" AutoGenerateColumns="False" >
            <DataGrid.Columns>
                <DataGridComboBoxColumn ItemsSource="{StaticResource ReminderValues }" />
            </DataGrid.Columns>
        </DataGrid>
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="428,12,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    </Grid>
</Window>

CS

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        for (int i = 0; i < dgResults.Items.Count; i++)
        {
            var x = dgResults.GetCell(i, 0).Content as System.Windows.Controls.ComboBox;

            var array = x.ItemsSource as string[];
            x.SelectedItem = array.Where(s => s == "B").FirstOrDefault();
        }
    }
}

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