几年前我做了很多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搜索示例时看起来似乎很难。
任何帮助都是适用的。
答案 0 :(得分:2)
您可能需要使用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。如果您需要WPF来跟上属性值的变化,请不要忘记在INotifyPropertyChanged
上实施WorkItem
。
答案 1 :(得分:0)