1

我正在 Windows 手机上开发应用程序。在视图中,我有带有 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 个项目,构造函数仅被调用 8 次。

4

2 回答 2

4

如果表单上只有 8 个项目可见,则不会为屏幕外项目调用构造函数,因为列表正在虚拟化它们。

您可以使用该属性更改此行为

 <ListBox x:Name="TestListbox" VirtualizingStackPanel.IsVirtualizing="False"
于 2012-06-18T15:13:30.523 回答
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

于 2012-06-18T16:09:10.277 回答