Какие методы можно использовать для создания серии элементов пользовательского интерфейса из коллекции объектов с использованием WPF? - PullRequest
1 голос
/ 25 марта 2010

Я новичок в WPF, и прежде чем полностью погрузиться в решение проблемы, мне было интересно, достаточно ли у него WPF, чтобы справиться с чем-то для меня.

Представьте, что у меня есть коллекция, содержащая объекты. Каждый объект имеет одинаковый известный тип и имеет два параметра. Имя (строка) и Picked (логическое значение).

Коллекция будет заполнена во время выполнения.

Я хотел бы создать элемент пользовательского интерфейса во время выполнения, который будет представлять эту коллекцию в виде серии флажков. Я хочу, чтобы параметр Picked любого данного объекта в коллекции обновлялся, если пользователь меняет выбранное состояние флажка.

Для меня ответ прост. Я выполняю итерацию по всей коллекции и создаю новый флажок для каждого объекта, динамически связывая событие ValueChanged для захвата, когда Picked должен быть изменен.

Однако мне пришло в голову, что я могу использовать какую-то неизвестную функцию WPF, чтобы сделать это лучше (или «правильно»). Например, может ли здесь использоваться привязка данных?

Мне было бы очень интересно чьи-либо мысли.

Спасибо

E

FootNote: структуру коллекции можно полностью изменить, чтобы она лучше подходила для любого выбранного решения, но в конечном итоге я всегда буду начинать и заканчивать некоторым списком строк и логических пар.

Ответы [ 3 ]

1 голос
/ 26 марта 2010

Это именно тот сценарий, который упрощает WPF. Обработчики событий - ба! Привязка данных и шаблоны данных делают это несложным. Я построил пример, иллюстрирующий, как вы можете это сделать.

Вот код, который объявляет класс для представления ваших элементов - PickedItem. Затем я создаю коллекцию этих предметов и заполняю ее некоторыми образцами.

public partial class DataBoundCollection : Window
{
    public DataBoundCollection()
    {
        Items = new ObservableCollection<PickedItem>();
        Items.Add(new PickedItem("Item 1"));
        Items.Add(new PickedItem("Item 2"));
        Items.Add(new PickedItem("Item 3"));

        InitializeComponent();
    }

    public ObservableCollection<PickedItem> Items
    {
        get;
        set;
    }
}

public class PickedItem
{
    public PickedItem(string name)
    {
        Name = name;
        Picked = false;
    }

    public string Name
    {
        get;
        set;
    }

    public bool Picked
    {
        get;
        set;
    }
}

Теперь давайте посмотрим на разметку XAML для этого окна:

<Window x:Class="TestWpfApplication.DataBoundCollection"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="DataBoundCollection" Height="300" Width="300"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
    <ListBox ItemsSource="{Binding Items}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <CheckBox IsChecked="{Binding Picked}" Margin="5"/>
                    <TextBlock Text="{Binding Name}" VerticalAlignment="Center"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

Я создаю ListBox для хранения элементов и привязываю его свойство ItemsSource к коллекции, которую создал в коде. Затем я предоставляю ListBox ItemTemplate, который определяет, как будет отображаться каждый PickedItem. DataTemplate в этом случае так же просто, как флажок и некоторый текст, оба связаны с переменными-членами в PickedItem. Теперь, когда я проверяю любой из этих элементов, данные в базовой коллекции изменяются в режиме реального времени без необходимости в обработчиках событий. Та-да!

альтернативный текст http://img405.imageshack.us/img405/1083/databoundcollection.png

1 голос
/ 26 марта 2010

Я бы настоятельно рекомендовал ItemsControl, его поведение максимально приближено к элементу управления повторителем ASP.Net, поэтому оно очень гибкое.

Объявите элемент управления как:

        <ItemsControl Name="YourItemsControl" 
                      ItemsSource="{Binding Path=YourCollection}" 
                      ItemTemplate="{StaticResource YourTemplate}">
        </ItemsControl>   

Затем вы можете использовать таблицу данных для организации данных в формате отображения для пользователя

    <DataTemplate x:Key="ProjectsTemplate">

        <StackPanel Margin="0,0,0,10">
            <Border CornerRadius="2,2,0,0" Background="{StaticResource ItemGradient}" d:LayoutOverrides="Width, Height">
                <local:ItemContentsUserControl Height="30"/>
            </Border>
     ...

Полезные элементыКонтрольные ссылки

Надеюсь, это вам поможет.

1 голос
/ 25 марта 2010

Вы можете использовать шаблоны данных. Вот хороший пост об этом.

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