Привязка ComboBox ItemsSource в DataGrid RowDetailsTemplate - PullRequest
0 голосов
/ 24 марта 2011

Я пытаюсь связать ItemsSource с ComboBox в RowDetailsTemplate.Если я помещаю ComboBox вне сетки, он работает нормально.Я думаю, что это происходит из-за того, что свойство ItemsSource в сетке может сбрасывать ComboBox в RowDetailsTemplate.XAML ниже всяких мыслей?

Категории и типы CatTypes - это два разных ObservableCollection s.

Нет ошибок;ComboBox просто выглядит пустым.

<ComboBox ItemsSource="{Binding CatTypes}"></ComboBox>
        <my:DataGrid Name="gridProds" AutoGenerateColumns="False"
        AlternatingRowBackground="Gainsboro" ItemsSource="{Binding Categories}">
            <my:DataGrid.Columns>
                <my:DataGridTextColumn x:Name="CatId" Header="CatID" Width="Auto" Binding="{Binding CategoryID}" />
                <my:DataGridTextColumn Header="CatName" Width="Auto" Binding="{Binding CategoryName}" />
            </my:DataGrid.Columns>
            <my:DataGrid.RowDetailsTemplate>
                <DataTemplate>
                    <Border>
                        <StackPanel>
                            <StackPanel Orientation="Horizontal">
                                <Label>ID:</Label>
                                <TextBox Name="txtGridCatId" Text="{Binding CategoryID}"/>
                            </StackPanel>
                            <StackPanel Orientation="Horizontal">
                                <Label>Category Type:</Label>
                                <ComboBox ItemsSource="{Binding CatTypes}"></ComboBox>
                            </StackPanel>
                        </StackPanel>
                    </Border>
                </DataTemplate>
            </my:DataGrid.RowDetailsTemplate>
        </my:DataGrid>

В вызываемом источнике данных есть класс, в котором выполняется следующее:

private ObservableCollection<string> _cattypes = new ObservableCollection<string> { };

    public ObservableCollection<string> CatTypes
    {
        get
        {

            _cattypes = new ObservableCollection<string> { };

            SqlConnection con = new SqlConnection("MyConnStringHere;");
            SqlCommand cmd = new SqlCommand("Select ID, CatType from PfCategoryType ORDER BY CatType", con);
            con.Open();
            SqlDataReader rdr = cmd.ExecuteReader();

            while (rdr.Read())
            {
                string CatType = (string)rdr["CatType"];
                _cattypes.Add(CatType);

            }

            con.Close();

            return _cattypes;
        }
    }

В MainWindow.xaml.cs у меня есть:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        DataSource dataSource = new DataSource();
        this.DataContext = dataSource;
    }
}

Ответы [ 2 ]

0 голосов
/ 25 марта 2011

Что произойдет, если вы попробуете это?

<ComboBox DataContext="{Binding DataContext, ElementName=myControl}" ItemsSource="{Binding CatTypes}" />

(Конечно, вы должны переименовать myControl в соответствии с именем вашего окна.)

Здесь мы устанавливаем контекст данных поля со списком таким же, как контекст данных окна. Поскольку это также тот же контекст данных первого поля со списком в вашем XAML, я думаю, что второе поле со списком начнет вести себя как первый. (Хотя я беспокоюсь, что это приведет к некоторым ненужным соединениям с базой данных, по одному на строку сетки.)

Если подумать, если вам нужно установить другие свойства в контексте строки, вы не захотите устанавливать контекст данных всего ComboBox. В таком случае я бы попробовал что-то вроде этого.

<ComboBox ItemsSource="{Binding ElementName=myControl, Path=DataContext.CatTypes}" SelectedItem="{Binding CategoryType}" />
0 голосов
/ 24 марта 2011

Если вы проверите выходные данные отладки в VS, вы увидите фактическую ошибку привязки. Скорее всего, приведенный ниже код это исправит.

<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=CatTypes}" />

Если вы не можете заставить RelativeSource работать, используйте имена. Свойство CatTypes является свойством некоторого класса, для которого вы создали объект и задали как datacontext некоторый элемент управления. Просто дайте этому элементу управления имя (например, myControl) и выполните привязку следующим образом:

<ComboBox ItemsSource="{Binding ElementName=myControl, Path=CatTypes}" />

Если это не сработает, вам нужно опубликовать больше кода, чтобы понять, что вы делаете неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...