3

这一定很简单,但我所有的搜索都会导致基于绑定的解决方案,这不是我的情况。

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

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,但此特定列并未绑定到底层或其他内容。另外,我确定这不是拼写问题。

4

3 回答 3

1

睡了一会儿终于想通了。如果您DataGridComboBoxColumn的网格中有 UNBOUND(即该列未绑定到基础数据源中的列)并且其ItemsSource属性绑定到数组或其他内容,则必须在DataGrid声明中添加以下内容:

SelectedItemBinding="{Binding /}"

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

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

于 2013-09-05T02:20:25.897 回答
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;
}

如果ComboBoxes 都选择了最后一个选项,则此代码运行良好。如果没有,那么你就有问题了。如果它确实有效,则问题可能是您与集合中要选择的字符不完全匹配......请记住,即使一个字符的大小写错误,它也不会匹配,因此不会t 被选中。stringItems

如果上面的代码不起作用那么也许您需要GetCell进一步测试您的方法......您是否在此循环中放置了一个断点for以验证x确实是正确的单元格?

于 2013-09-04T13:40:03.070 回答
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();
        }
    }
}
于 2013-09-04T13:49:40.503 回答