我正在开发Windows手机上的应用程序。 在View上我有带ListBox的网格:
<Grid x:Name="ContentGrid"
Grid.Row="1">
<ListBox x:Name="TestListbox"
ItemsSource="{Binding History}"
Margin="24,0"
SelectionChanged="GoToSelection"
ItemTemplate="{StaticResource HistoryDataTemplate}"
>
</ListBox>
</Grid>
历史是ObservableCollection。
HistoryDataTemplate看起来像:
<phone:PhoneApplicationPage.Resources>
<DataTemplate x:Key="HistoryDataTemplate">
<Grid>
<HistoryControls:HistoryItem d:LayoutOverrides="Width" Margin="0,0,0,24"/>
</Grid>
</DataTemplate>
</phone:PhoneApplicationPage.Resources>
我使用HistoryItem的构造函数来订阅PropertyChanged事件:
public HistoryItem()
{
InitializeComponent();
base.Loaded+=(new RoutedEventHandler(this.HistoryControl_Loaded));
}
private void HistoryControl_Loaded(object sender, RoutedEventArgs e)
{
this._dataContext.PropertyChanged += new PropertyChangedEventHandler(this._dataContext_PropertyChanged);
}
当我有1-8个项目时,所有工作都正确,但是对于> 8个项目,constuctor只被调用8次。
答案 0 :(得分:4)
如果表单上只有8个项目可见,则不会为关闭屏幕项目调用构造函数,因为列表正在虚拟化它们。
您可以使用属性
更改此行为 <ListBox x:Name="TestListbox" VirtualizingStackPanel.IsVirtualizing="False"
答案 1 :(得分:1)
我添加了ListBox.ItemsPanel,它有所帮助。 更多信息: http://blogs.msdn.com/b/oren/archive/2010/11/08/wp7-silverlight-perf-demo-1-virtualizingstackpanel-vs-stackpanel-as-a-listbox-itemspanel.aspx