Привязка простого бизнес-класса к пользовательскому элементу управления WPF - PullRequest
2 голосов
/ 08 февраля 2010

Пару лет назад я сделал немного WPF, но, похоже, все забыл.

Предположим, у меня простой бизнес-класс, скажем, рабочий элемент TFS.

public class WorkItem
{
    public WorkItem(string name, DateTime date)
    {
        Name = name;
        Date = date;
    }

    public string Name { get; set; }
    public DateTime Date { get; set; }
}

Тогда у меня есть список WorkItems, возможно, что-то вроде этого.

class WiList : ObservableCollection<WorkItem>
{
    public WiList () : base()
    {
        Add(new WorkItem("1", DateTime.Now));
        Add(new WorkItem("2", DateTime.Now));
    }
}

Тогда у меня есть UserControl, который представляет WorkItem, что-то вроде этого.

<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    x:Class="WrapPanelItemsControlTest.WorkItemControl"
    x:Name="UserControl"
    d:DesignWidth="640" d:DesignHeight="480" HorizontalAlignment="Left"
    VerticalAlignment="Top" Width="72" Height="40">

<StackPanel x:Name="LayoutRoot">
    <TextBlock x:Name="Name"/>
    <TextBlock x:Name="Date"/>
</StackPanel>

Главное окно содержит WrapPanel для хранения пользовательских элементов управления. У меня вопрос, как мне создать WrapPanel, которая привязывается к WiList и отображает WorkItems? Я помню, что делал что-то подобное раньше, но из-за своей смерти я не могу вспомнить, как это произошло (возможно, что-то из блога Би Косты). Конечно, я нигде не могу найти свой старый тестовый код, и, похоже, он очень плох в поиске примеров.

Любая помощь оценивается.

Ответы [ 2 ]

2 голосов
/ 08 февраля 2010

Вам, вероятно, нужно использовать ItemsControl для этого. WrapPanel можно использовать как панель макета для элементов коллекции. И если вам требуется только UserControl для отображения свойств одного объекта, то лучшим вариантом будет использование DataTemplate. Вот немного XAML:

<Window.Resources>

    <DataTemplate x:Key="WorkItemTemplate" DataType="{x:Type local:WorkItem}">
        <StackPanel>
            <TextBlock Text="{Binding Name}"/>
            <TextBlock Text="{Binding Date}"/>
        </StackPanel>
    </DataTemplate>

</Window.Resources>

<Grid>

    <ItemsControl
        x:Name="itemsList"
        ItemTemplate="{StaticResource WorkItemTemplate}"
        >
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>

</Grid>

И в коде позади привязать ItemsControl к коллекции:

itemsList.ItemsSource = new WIList(); // or wherever the collection comes from

P.S. Инициализация ItemsSource и общий доступ к элементам управления из кода для привязки их к данным не является хорошей практикой. Вам понадобится класс ViewModel (Presenter) в качестве DataContext вашего окна. Если вы решили остаться на некоторое время с WPF, мой совет - попробуйте использовать MVVM .

P.P.S. Не забудьте внедрить INotifyPropertyChanged в WorkItem, если вам нужно, чтобы WPF не отставал от изменений значений свойств.

0 голосов
/ 08 февраля 2010

Сначала вам нужно привязать экземпляр вашего класса WiList к ItemsSource элемента ItemsControl, а затем применить DataTemplate для вашего WorkItem.

Здесь есть похожая нить здесь .

Подробнее о Панели элементов ItemsControl можно узнать здесь .

...