2010-02-08 62 views
2

几年前,我做了很多WPF,但似乎忘记了一切。将简单的业务类绑定到WPF UserControl

假设我有一个简单的商务课程,比如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来保存用户控件。我的问题是,我如何创建一个绑定到WiList并显示WorkItems的WrapPanel?我记得之前做过这样的事情,但对于我的死亡我不记得是怎么回事(可能来自Bea Costa的博客)。当然,我无法在任何地方找到我的旧测试代码,并且在搜索示例时看起来很糟糕。

任何帮助appreaciated。

回答

0

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

还有一个类似的线程here

你可以找到更多关于ItemsControl的ItemsPanel here

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 

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

P.P.S.如果您需要WPF跟上属性值的更改,请不要忘记在WorkItem上执行INotifyPropertyChanged

+0

正在初始化ItemsSource _from code-behind_不是一个好习惯。你可能意思是这样,但从P.S.中可能不清楚。 +1 =) – 2010-02-08 21:08:53

+0

谢谢!当然,我放弃了这些话,我会纠正自己 – arconaut 2010-02-08 21:15:33