1

Windows Phone でアプリを開発しています。ビューでは、リストボックスを使用したグリッドがあります:

<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>

PropertyChanged イベントをサブスクライブするために、HistoryItem のコンストラクターを使用します。

     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 に答える