将简单的业务类绑定到WPF UserControl

时间:2010-02-08 20:14:57

标签: wpf data-binding wrappanel

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

然后我有一个表示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>

主窗口包含一个用于保存UserControls的WrapPanel。我的问题是,如何创建一个绑定到WiList并显示WorkItems的WrapPanel?我记得之前做过这样的事情,但是对于我的死,我不记得怎么样(可能是Bea Costa的博客)。当然,我无法在任何地方找到我的旧测试代码,并且在google搜索示例时看起来似乎很难。

任何帮助都是适用的。

2 个答案:

答案 0 :(得分: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

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

P.P.S。如果您需要WPF来跟上属性值的变化,请不要忘记在INotifyPropertyChanged上实施WorkItem

答案 1 :(得分:0)

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

有类似的帖子here

您可以找到有关ItemsControl的ItemsPanel here的更多信息。