2

バインディングにクラス プロパティを使用したくありません。

うまくいかないのはなぜですか?どうすればこれを修正できますか。私は空の行を取得します。また、DataGrid の列を手動で定義しました。

 private void Insert(IList<string> row, DataGrid dG)
        {
            ObservableCollection<IList<string>> data = dG.ItemsSource as ObservableCollection<IList<string>>;
            data.Add(row);
            dG.ItemsSource = data;
        }
4

1 に答える 1

3

まず、データ バインディングを使用する代わりにメソッドを使用して DataGrid プロパティに直接アクセスする場合は、DataGrid.ItemsSource ではなく DataGrid.Items プロパティを使用する必要があります。

private void Insert(IList<string> row, DataGrid dG)
{
    dG.Items.Add(row);
}

ただし、DataGrid には行内の各文字列を正しい列定義にリンクする方法がないため、空の行が表示されます。

最良のアプローチはコンバーターを使用することだと思います:

IValueConverter から継承する RowIndexConverter クラスを作成し、Convert メソッドが次のようになるようにします。

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    int index = System.Convert.ToInt32(parameter);
    return (value as IList)[index];
}

これを機能させるには、DataGrid の行のように IList プロパティへのバインディングで使用し、インデックスを ConverterParameter として渡す必要があります。XAML は次のようになります。

<Window x:Class="Test.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Test"
    Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:RowIndexConverter x:Key="rowIndexConverter" />
    </Window.Resources>
    <Grid>
        <DataGrid x:Name="DataGrid">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding ., Converter={StaticResource rowIndexConverter}, ConverterParameter=0}" />
                <DataGridTextColumn Binding="{Binding ., Converter={StaticResource rowIndexConverter}, ConverterParameter=1}" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

出来上がり!値が表示されます。さらに列が必要な場合は、列を追加して ConvertParameter をインクリメントするだけです。行が十分に長くない場合、コンバーターは例外をスローするため、注意してください。

于 2012-10-31T14:02:36.380 に答える