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()hereから取得した拡張メソッドです。

問題は、この列の特定のセルをクリックすると、セルにドロップダウンが表示され、すべての配列項目が正しく入力されますが、ドロップダウンの現在のテキストが空である、つまり、対応する項目が自動的に選択されないことです。ドロップダウン。私は何が欠けていますか?

編集

私のDataGridの関連部分は次のとおりです。

<DataGrid x:Name="dgResults" AutoGenerateColumns="False" >
    <DataGrid.Columns>
        <DataGridComboBoxColumn ItemsSource="{StaticResource ReminderValues }" />
    </DataGrid.Columns>
</DataGrid>

ご覧のとおり、DataColumnDataGrid 全体が DataTable にバインドされていますが、この特定の列は基になるものなどにバインドされていません。また、これがスペルの問題ではないことは確かです。

4

3 に答える 3

1

ひと眠りした後、ようやく理解できました。グリッドに UNBOUNDDataGridComboBoxColumnがあり (つまり、列が基になるデータ ソースの列にバインドされていない)、そのItemsSourceプロパティが配列などにバインドされている場合は、DataGrid宣言に次を追加する必要があります。

SelectedItemBinding="{Binding /}"

上記のスラッシュ文字 (/) は現在のアイテム自体を表し、これが SelectedItem の目的です。

これで、DataGrid に値が正しく表示され、セルがフォーカスされると、正しい値が選択された ComboBox が表示されます。

于 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 で最後のオプションが選択されている場合、このコードはうまく機能します。そうでない場合は、問題があります。それが機能する場合、問題は、選択したいコレクション内の と正確に一致しなかった可能性があります...覚えておいてください、1文字でも大文字と小文字が間違っていると、一致しないため、一致しません.選択されません。stringItems

上記のコードが機能しない場合は、メソッドをさらにテストする必要があるかもしれません...実際に正しいセルであることを確認するためGetCellに、このループにブレークポイントを入れましたか?forx

于 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 に答える