1

我有ListBox一个 Windows Phone 应用程序。在一个按钮操作中,我需要ListBoxItem在被ListBox调用的每一个上设置一个转换和名称lb

我的数据源是

var items = new ObservableCollection<string>();
for (int i = 0; i < 10; ++i)
{
    items.Add("Item " + i);
}
lb.ItemsSource = items;

我有一个代码可以添加到ListBox 中的RenderTransform每个ListBoxItem

for (int i = 0; i < items.Count;++i )
{
    var item = this.lb.ItemContainerGenerator.ContainerFromIndex(i) as ListBoxItem;
    item.RenderTransform = new CompositeTransform();
    item.Name = i.ToString() //needed for storybord
    //another stuff
}

它工作正常。问题是我首先需要在列表中插入和项目。当我items.Insert(index,"test")在 for 循环之前调用时,我得到一个异常,即 item 为 null when i==index。插入新项目时无关紧要,该项目总是为空。

我究竟做错了什么?或者ListBox在尝试访问之前插入新项目时是否需要等待事件ListBoxItem

编辑:我提取了代码并将其放入解决方案中:https ://dl.dropboxusercontent.com/u/73642/PhoneApp2.zip 。我首先将一个假项目插入到新解决方案中,然后将其淡出并使用动画将原始项目移动到该位置。

4

2 回答 2

2

在添加项目后,由于 UI 子系统的异步特性,不会立即生成容器。尝试订阅 ItemsChanged(或 StatusChanged,对不起,我不记得了)并在使用正确的事件参数触发事件时获取项目。

于 2013-04-13T07:20:24.483 回答
-1

等待 Dispatcher 完成它正在做的事情,例如(由于添加了新项目而更新 UI)

this.Dispatcher.BeginInvoke(() =>
{
   //Code Here
});

如果您曾经操作 UI,例如在没有更新 UI 的情况下将项目添加到列表框,您将无法运行针对 UI 的代码。

编辑:这是您的项目开始工作的代码

 private void Button_Click(object sender, RoutedEventArgs e)
    {            
        start = Int32.Parse(from.Text);
        end = Int32.Parse(to.Text);

        fake = items[start];
        //items.Insert(end, fake);

        this.Dispatcher.BeginInvoke(() =>
        {
            for (int i = 0; i < items.Count; ++i)
            {
                var item = this.lb.ItemContainerGenerator.ContainerFromIndex(i) as ListBoxItem;
                item.Name = i.ToString();
            }


            (this.lb.ItemContainerGenerator.ContainerFromIndex(end) as ListBoxItem).RenderTransform = new CompositeTransform();
            (this.lb.ItemContainerGenerator.ContainerFromIndex(end) as ListBoxItem).Name = "listBoxItem1";


            (this.lb.ItemContainerGenerator.ContainerFromIndex(start) as ListBoxItem).Name = "listBoxItem";

            sbListBox.Begin();
        });

    }
于 2013-04-12T22:09:13.233 回答