SilverLight:如何确保ListBox完全释放其子UIElements

时间:2014-04-27 13:27:34

标签: c# windows-phone-8 listbox silverlight-5.0 listboxitem

如果我有这样的模型:

公共类LayerViewModel     {

    public LayerViewModel(string name, string alias, UIElement representation)
    {
        Name = name;
        Alias = alias;
        Representation = representation;
    }

    public string Name { get; set; }
    public string Alias { get; set; }

    public UIElement Representation
    {
        get; private set; 
    }                  
}

使用以下DataTemplate:

<ListBox.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="Auto"/>
                            </Grid.ColumnDefinitions>
                        <ContentControl Content="{Binding Representation, Mode=OneTime}"/>
                        <TextBlock 
                            VerticalAlignment="Center"
                            Grid.Column="1" Text="{Binding Alias}" 
                                   FontSize="{StaticResource PhoneFontSizeLarge}"
                                   Margin="16 21 0 20" TextWrapping="Wrap"/>                            
                        </Grid>

                    </DataTemplate>
                </ListBox.ItemTemplate>

如果将这些模型的集合绑定到ListBox,导航并返回到ListBox的包含页面,则应用程序将崩溃。这是因为即使ListBox的ItemSource在卸载其包含页面时设置为null,也不会从VisualTree中释放LayerViewModel.Representation。我使用DependencyObject.GetVisualAncestors()来确认这一点。

如何让ListBox完全释放所有编译其VisualTree的UIElements?将其ItemsSource设置为null并不能实现这一目标。

0 个答案:

没有答案