0

我在我的 WP8 应用程序中使用 LINQ/SQL 来管理列表框中显示的项目集合。有时,这些对象中的一个被使用另一个 DataContext 的长时间运行的操作更改。这些更改可能是 CRUD 操作之一,因此也可以在后台创建对象。

在 iOS 中有 NSFetchedResultsController 或者我可以使用 NSNotification - 我正在寻找类似的东西。

为更新案例更新一些代码

我正在拿我的物品是这样的:

    void loadData() {
        var items = from r in itemDB.items orderby r.UpdatedAt descending select r;
        var Items = new ObservableCollection<Item>(items);
        lstData.ItemsSource = Items;
    }

我的列表框看起来像这样

        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid Margin="10" >
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"></ColumnDefinition>
                    </Grid.ColumnDefinitions>
                    <TextBox Text="{Binding LocalState}" />
                </Grid>
            </DataTemplate>   
        </ListBox.ItemTemplate>
    </ListBox>

我的背景代码如下所示:

static public void UploadAll() {



        ThreadPool.SetMaxThreads(1,1);

        ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc));

    }

    static void ThreadProc(Object stateInfo)
    {
        ItemsContext itemsDB = new ItemsContext(ItemsContext.DBConnectionString);

        var notUploadedItems = (from i in itemsDB.items
                                    where !i.LocalState.Equals("server")
                                    select i);

        var Items = new ObservableCollection<Item>(notUploadedItems);
        foreach (Item a in Items)
        {
            a.Save(() =>
            {
                Deployment.Current.Dispatcher.BeginInvoke(delegate
                {
                    a.LocalState = "server";
                    itemsDB.SubmitChanges();


                });

                //NOW THE LISTBOX SHOULD BE UPDATED
            }, (err) =>
            {

            });
        }


    }

//NOW THE LISTBOX SHOULD BE UPDATED评论处,应更新相应的列表框模板

添加/删除案例类似。

干杯。

4

1 回答 1

0

直截了当,ObservableCollection每次数据更改时创建新实例然后将其重新分配给ItemSource,不仅ObservableCollection无视Data Binding.

//this is the line I am talking about:
var Items = new ObservableCollection<Item>(notUploadedItems);

相反,创建ObserbaleCollection一次 -- 使其成为一个属性:

private readonly ObservableCollection<Item> _items = new ObservableCollection<Item>();
public ObservableCollection<Item> Items {get {return _items;}

对于更新,使用集合的 '.Add()' 或 'Remove()' 方法

您是正确的,您必须在 UI 主线程上进行更新:

  DoItOnUIThread(() =>Items.Add(newItem));

   //here's a sample of method that would take any action and execute it on UI thread..
   private void DoItOnUIThread(Action action)
    {
        if (_dispatchService == null) 
           _dispatchService = ServiceLocator.Current.GetInstance<IDispatchService>();

        if (_dispatchService.CheckAccess())
            action.Invoke ();
        else
            _dispatchService.Invoke(action);
    }

让 observable 集合完成其工作,即通过绑定新项目及其属性更改来自动更新 UI。如果所有这些都正确连接/完成,则您的列表框根本不需要在 cs 代码中更新。

于 2013-06-17T22:33:27.410 回答