Заполните StackPanel с флажками из базы данных - PullRequest
3 голосов
/ 11 марта 2010

Я новичок в WPF. У меня есть страница, которая отображает данные из базы данных SQL, используя L2S. L2S возвращает DataTable, который содержит все доступные опции для выбора для конкретной области. Каждая строка, которую он возвращает из базы данных, должна быть checkbox, и я хочу поставить эти флажки в stackpanel.

Смотрю ли я на привязку данных к StackPanel? Это неправильно ... Я догадывался, что мне нужно перебрать DataTable и создать элементы-флажки для каждой строки, а затем добавить их во время выполнения к StackPanel. Это правильно? Возвращает DataTable часть моей проблемы?

Я вижу, что StackPanel имеет свойство DataContext, но я не могу просто установить его, потому что он не будет знать, что каждый элемент checkbox будет правильным,

Ответы [ 2 ]

8 голосов
/ 11 марта 2010

Вы, вероятно, хотите ItemsControl. Это позволяет вам представить серию элементов, используя указанный шаблон данных. Вы можете сделать это встроенным в ItemsControl:

   <ItemsControl ItemsSource="{Binding MyCollectionOfItems}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <CheckBox IsChecked="{Binding NameOfTheCheckedPropertyOnEachItem}"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>  

или ссылаться на шаблон данных явно из ресурса ... что-то вроде:

    <!-- In some parent resource section -->
    <DataTemplate x:Key="MyDataTemplateName">
        <CheckBox IsChecked="{Binding NameOfTheCheckedPropertyOnEachItem}"/>
    </DataTemplate>

    <!-- ... -->

    <ItemsControl ItemsSource="{Binding MyCollectionOfItems}" ItemTemplate="{StaticResource MyDataTemplateName}">
    </ItemsControl>

Или вы можете определить DataTemplate, который определяет внешний вид вашего связанного класса. (Обратите внимание, что если ваш Linq-to-SQL проецируется в анонимный тип, это не вариант) Что-то вроде:

        <!-- In some parent resource section -->
        <DataTemplate DataType="{x:Type MyBoundClass}">
            <CheckBox IsChecked="{Binding NameOfTheCheckedPropertyOnEachItem}"/>
        </DataTemplate>

    <!-- ... -->

    <ItemsControl ItemsSource="{Binding MyCollectionOfItems}">
    </ItemsControl>

Затем WPF будет искать шаблон данных, соответствующий типу данных каждого из элементов вашей коллекции. Обратите внимание, что это может быть ОЧЕНЬ полезно для связывания разнородных коллекций, которые нуждаются в разных презентациях.

Вы МОЖЕТЕ связать DataContext панели стека, но нет никакой логики повторения шаблона для каждого элемента данных. Он просто предоставляет контекст для дочерних элементов управления и содержит {Binding ...} операторов. Все элементы управления, которые обрабатывают повторяющиеся данные, происходят из ItemsControl и передают свои данные через свойство ItemsSource.

3 голосов
/ 11 марта 2010

В дополнение к ответу Бена фон Хандорфа я подумал, что было бы полезно упомянуть, что вы также можете изменить способ, которым ItemsControl упорядочивает свои элементы, изменив ItemsPanel. Например:

<ListBox ItemsSource="{Binding MyCollection}">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

Это позволяет ListBox упорядочивать элементы по горизонтали, а не по вертикали. Вы также можете использовать WrapPanel, если хотите, чтобы элементы «текли» как текст (или span, если вы знаете html). WrapPanel также может быть ориентирован горизонтально или вертикально. (Но старайтесь не использовать WrapPanel для больших коллекций предметов, потому что он не виртуализируется и вызовет некоторое большое отставание.)

Вы даже можете создавать свои собственные пользовательские панели и заменять их. Однажды я создал панель, которая выкладывала ее элементы случайным образом, и использовал ее для ListBox. Каждый элемент в моей связанной коллекции отображался в произвольной позиции в ListBox. Каждый раз, когда макет обновлялся, предметы получали новую позицию.

...