ComboBox не связывает в датагрид - PullRequest
0 голосов
/ 08 августа 2011

У меня есть ComboBox, связанный с BindingList со строками.Он работает нормально.

public BindingList<string> MyList
{
    get
    {
        BindingList<string> list = new BindingList<string>();
        list.Add("one");
        list.Add("two");
        list.Add("three");

        return list;
    }
}

xaml:

<ComboBox x:Name="MyCmbBox" ItemsSource="{Binding Path=MyList}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Когда я помещаю один и тот же код в сетку данных WPF 4, он больше не работает (но комбо вне сетки данных все еще работаетхорошо):

<DataGrid AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox x:Name="MyCmbBox" ItemsSource="{Binding Path=MyList}">
                        <ComboBox.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding}" />
                            </DataTemplate>
                        </ComboBox.ItemTemplate>
                    </ComboBox>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

Почему?Спасибо

1 Ответ

1 голос
/ 08 августа 2011

Потому что в случае DataGrid ComboBox имеет другой DataContext - элемент данных строки сетки, который не имеет свойства MyList.

Чтобы исправить это, вы можете использовать RelativeSource привязку для привязки к DataContext сетки:

<DataGrid AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox x:Name="MyCmbBox" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.MyList}">
                        <ComboBox.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding}" />
                            </DataTemplate>
                        </ComboBox.ItemTemplate>
                    </ComboBox>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>
...