Как привязать одну и ту же коллекцию значений ко всем ComboBox в DataGridComboBox? - PullRequest
1 голос
/ 27 марта 2011

У меня есть коллекция значений в массиве строк, или в списке, или что-то еще, и я хочу установить эту коллекцию значений как коллекцию элементов во всех комбинированных списках столбца как DataGridComboBoxColumn в WPF.

Я думаю, что у меня нет другого способа получить доступ к этой коллекции значений и связать ее одинаково со всеми ComboBox (в XAML), кроме DataContext. Но могу ли я получить доступ к DataContext DataGrid из DatGridComboBoxColumn (в XAML)? Могу ли я это сделать? Как?

Как указать (в XAML) в DatagridComboBoxColumn, чтобы эта коллекция элементов была одинаково во всех комбинированных списках? Как мне этого добиться?

Вот мой XAML:

(...)xmlns:local="clr-namespace:WpfApp"(...)

<Grid Name="grid1">
    <DataGrid Name="dataGrid" AutoGenerateColumns="True">
        <DataGrid.Columns>
            <DataGridComboBoxColumn Header="Options" Width="100"/>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

А вот мой код:

public class TestClass
{
    private static string[] stringArray = { "Option One", "Option Two", "Option Three" };

    public static string[] StringArray
    {
        get
        {
            return stringArray;
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 27 марта 2011

Но могу ли я получить доступ к DataContext DataGrid из столбца DatGridComboBox (в XAML)?Могу ли я это сделать?Как?

Нет простого способа получить доступ к DataContext из DataGrid из определения столбца, потому что он не является частью визуального или логического дерева, поэтому он не наследуетDataContext.Недавно я написал в блоге о решении этой проблемы .По сути, вам нужно сделать что-то подобное:

<DataGrid Name="dataGrid" AutoGenerateColumns="True">
    <DataGrid.Resources>
        <!-- Proxy for the current DataContext -->
        <local:BindingProxy x:Key="proxy" Data="{Binding"} />
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridComboBoxColumn Header="Options" Width="100"
                                ItemsSource="{Binding Source="{StaticResource proxy}", Path=Data}"/>
    </DataGrid.Columns>
</DataGrid>

BindingProxy - это простой класс, производный от Freezable и предоставляющий свойство зависимости Data.

1 голос
/ 27 марта 2011

В привязке, где вы указываете только Path, механизм привязки будет неявно использовать DataContext в качестве источника. Вам нужно только явно указать источник, чтобы избежать этого (поскольку вы не хотите, чтобы текущая строка была вашим источником).

В одном из моих тестовых приложений у меня есть класс Employee, который имеет несколько свойств, включая Occupation, чтобы использовать его со столбцом ComboBox, вам нужен список профессий, где и как вы определяете этот список вам, один из способов сделать это в ресурсах окна или DataGrid:

    <col:ArrayList x:Key="Occupations">
        <sys:String>Programmer</sys:String>
        <sys:String>GUI Designer</sys:String>
        <sys:String>Coffee Getter</sys:String>
    </col:ArrayList>

где col - пространство имен: clr-namespace:System.Collections;assembly=mscorlib

Чтобы использовать это сейчас, я могу указать в DataGrid.Columns следующее:

<DataGridComboBoxColumn SelectedValueBinding="{Binding Occupation}"
                        ItemsSource="{Binding Source={StaticResource Occupations}}"/>

Это позволит мне назначить одно из трех «занятий» из моего массива как Occupation рассматриваемого сотрудника.

Еще один способ настроить свой список источников - использовать статическое свойство некоторого класса, которое вы можете использовать:

<DataGridComboBoxColumn ... ItemsSource="{Binding Source={x:Static namespace:Class.Property}}"/>
...