长列表选择器可观察集合和可视树 – 问题?

我做了一个简短的例子来说明我遇到了一些问题。 他们将LongsListSelector绑定到ObservableCollection(不管是什么类型的项目)。 我将长列表项模板设置为(例如)一个文本块,我还制作了三个按钮 – 将一个元素添加到集合中,删除最后一个元素,以及搜索visuall树。 代码不是很长,所以我将在下面发布它(如果你想要整个例子,请访问: http : //sdrv.ms/163TYEG )。

XAML(标题除外):

               

和C#:

  public partial class MainPage : PhoneApplicationPage { private ObservableCollection collection = new ObservableCollection(); public MainPage() { InitializeComponent(); phoneLLS.ItemsSource = collection; addBtn.Click += addBtn_Click; delBtn.Click += delBtn_Click; showBtn.Click += showBtn_Click; } private void addBtn_Click(object sender, RoutedEventArgs e) { collection.Add("element"); } private void delBtn_Click(object sender, RoutedEventArgs e) { collection.RemoveAt(collection.Count - 1); } private void showBtn_Click(object sender, RoutedEventArgs e) { List controlList = new List(); SearchForControls(phoneLLS, ref controlList); } private static void SearchForControls(DependencyObject parent, ref List controlList) where T : DependencyObject { int numberOfChildreen = VisualTreeHelper.GetChildrenCount(parent); for (int i = 0; i < numberOfChildreen; i++) { var child = VisualTreeHelper.GetChild(parent, i); if (child is T) controlList.Add((T)child); else SearchForControls(child, ref controlList); } } } 

问题在哪里?

  1. 当我按下“添加”按钮时,集合会被一个元素放大。 好的,我看到它因为LLS中添加了元素项。 但试着把它推得更多。 之后在一个按钮内推出几个元素? 怎么了? 集合由一个元素放大,但LLS填充速度更快。

  2. 与删除相同 – 它删除一个元素,但是从LLS中删除一组项目有时会消失。

  3. 主要问题 – 在showBtn_Click的第二行切换断点。 添加一些元素,尝试搜索可视树(按下显示按钮)。 调试停止,在第二行之后,您可以看到可视树中元素的确切数字(与collection.Count不同)。 第二个大惊喜 – 当你删除en元素,并再次搜索可视树时,你会看到:集合已经下降(这是正确的),一些元素从LLS中消失(应该是一个),并且! – Visual树元素的数量没有改变(!)。 怎么了?

    这些是某种错误吗? 或许我不明白什么?

尝试将数据上下文设置为List并使用ItemsSource属性中的Bindings。

XAML:

  

代码背后:

 public partial class MainPage : PhoneApplicationPage { private ObservableCollection collection = new ObservableCollection(); public MainPage() { InitializeComponent(); phoneLLS.DataContext = collection; addBtn.Click += addBtn_Click; delBtn.Click += delBtn_Click; showBtn.Click += showBtn_Click; } ... } 

让我知道这个是否奏效。

我还做了一些进一步的研究 – 如果你用LLS重新进入页面,一切都更新正确 – 可视树有许多元素,如集合。 我修改了一个例子( http://sdrv.ms/169kRqI ):

让Main_Page成为second_page:

XAML:

                     

代码背后:

 public partial class second_page : PhoneApplicationPage { public second_page() { InitializeComponent(); phoneLLS.DataContext = MainPage.collection; addBtn.Click += addBtn_Click; delBtn.Click += delBtn_Click; showBtn.Click += showBtn_Click; } private void addBtn_Click(object sender, RoutedEventArgs e) { MainPage.collection.Add("element"); } private void delBtn_Click(object sender, RoutedEventArgs e) { MainPage.collection.RemoveAt(MainPage.collection.Count - 1); } private void showBtn_Click(object sender, RoutedEventArgs e) { List controlList = new List(); SearchForControls(phoneLLS, ref controlList); } private static void SearchForControls(DependencyObject parent, ref List controlList) where T : DependencyObject { int numberOfChildreen = VisualTreeHelper.GetChildrenCount(parent); for (int i = 0; i < numberOfChildreen; i++) { var child = VisualTreeHelper.GetChild(parent, i); if (child is T) controlList.Add((T)child); else SearchForControls(child, ref controlList); } } } 

和Main_Page – 仅导航:

XAML:

    

代码背后:

 public partial class MainPage : PhoneApplicationPage { public static ObservableCollection collection = new ObservableCollection(); public MainPage() { InitializeComponent(); goToPage.Click+=goToPage_Click; } private void goToPage_Click(object sender, RoutedEventArgs e) { NavigationService.Navigate(new Uri("/second_page.xaml", UriKind.Relative)); } } 

只需尝试在重新进入页面时执行相同操作:

  1. 添加例如3个元素,调试器在showBtn_Click的第二行切换断点并单击按钮 – 它将显示6个元素! 除了回去,不要碰任何东西。

  2. 重新输入第二页 – 您将获得正确的LLS – 使用3个元素,当您单击带断点的showBtn时,您将在Visual Tree中看到3个元素。

    有人试过吗?