2

几年前我做了很多 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; }
}

然后我有一个工作项列表,可能是这样的。

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

然后我有一个代表 WorkItem 的 UserControl,就像这样。

<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 来保存用户控件。我的问题是,如何创建一个绑定到 WiList 并显示 WorkItems 的 WrapPanel?我记得以前做过这样的事情,但是因为我死了,我不记得是怎么做的(可能来自 Bea Costa 的博客)。当然,我在任何地方都找不到我的旧测试代码,而且似乎在谷歌搜索示例方面表现不佳。

任何帮助都会受到重视。

4

2 回答 2

2

您可能需要为此使用ItemsControlWrapPanel可以用作集合元素的布局面板。如果您只需要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

PS 初始化ItemsSource并通常从代码隐藏访问控件以将它们绑定到数据不是一个好习惯。您需要一个 ViewModel (Presenter) 类作为窗口的 DataContext。如果您考虑使用 WPF 一段时间,我的建议是 - 尝试使用MVVM

PPS如果您需要 WPF 来跟上属性值的变化,请不要忘记实施INotifyPropertyChangedon 。WorkItem

于 2010-02-08T20:57:29.680 回答
0

首先,您需要将 WiList 类的实例绑定到 ItemsControl 的 ItemsSource,然后为您的 WorkItem 应用 DataTemplate。

这里有一个类似的线程。

您可以在此处找到有关 ItemsControl 的 ItemsPanel 的更多信息。

于 2010-02-08T20:22:06.723 回答