0

Items=new ObservableCollection<double?>{}null 許容値のコレクション ( ) をデータグリッドにバインドしようとしています。以下は私にエラーを与えます

値を null にすることはできません。パラメータ名:キー

            <DataGrid Name="pointList" ItemsSource="{Binding Path=Value.Items,Converter={l:SelectableListArrayToListConverter}}" AutoGenerateColumns="False" >
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Value" Binding="{Binding}"/>
                </DataGrid.Columns>
            </DataGrid>

コンバーターを使用しようとすると、次のエラーが表示されます。双方向バインディングにはパスまたは XPath が必要です。

            <DataGrid Name="pointList" ItemsSource="{Binding Path=Value.Items,Converter={l:SelectableListArrayToListConverter}}" AutoGenerateColumns="False" >
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Value" Binding="{Binding}"/>
                </DataGrid.Columns>
            </DataGrid>

public class SelectableListArrayToListConverter : MarkupExtension, IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is IEnumerable)
        { 
            List<string> list = new List<string>();
            foreach(var item in value as IEnumerable )
            {
                if (item == null)
                    list.Add("NON");
                else
                    list.Add(item.ToString());

            }
            //Two-way binding requires Path or XPath

            return list;
        }

        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
}

上記のエラーは、双方向バインディングが List list = new List(); で機能していないためだと思います。

Itemssource が設定された後、DataGridTextColumn Binding が設定される前に、itemssource が行を構築するときにエラーが発生していると思います。

私はこれまでのところ運が悪いので、この問題の解決策を見つけるために広範囲に試みました.

この投稿に問題がある場合はお知らせください。修正します。

ありがとう。

4

2 に答える 2

0

あなたのバインディングは正しくないと思います。Value.Itemsのバインディングを確認してください。

これを試して。

 public Window2()
    {
        InitializeComponent();
        if (Items == null)
            Items = new ObservableCollection<double?>();

        for (int i = 0; i < 50; i++)
        {
            if (i % 5 == 0)
                Items.Add(null);
            else
                Items.Add(i);
        }

        this.DataContext = this;
    }

    public ObservableCollection<double?> Items { get; set; }

XAML:

<DataGrid Name="pointList" ItemsSource="{Binding Path=Items,Converter={local:SelectableListArrayToListConverter}}" AutoGenerateColumns="False" >
                            <DataGrid.Columns>
                                <DataGridTextColumn Header="Value" Binding="{Binding}"/>
                            </DataGrid.Columns>
                        </DataGrid>
于 2013-06-27T10:18:30.713 に答える