【问题标题】:Binding public static observablecollection绑定公共静态 observablecollection
【发布时间】:2014-07-12 21:50:19
【问题描述】:

我正在开发 WP8 应用程序,但在从普通页面导航回枢轴页面后绑定静态 observablecollection 时遇到问题。

像这样的场景我调用 webservice 然后我将接收到的数据添加到 observablecollection 之后我将 mylist.itemsource = my observablecollection 添加到我在枢轴内的列表框中,它的工作完美告诉我在导航返回时从枢轴构建新页面从新页面到我的数据透视页面,数据透视从头开始重新加载所有数据,所以为了避免这个问题,我制作标志来检查数据是否加载,所以当我让它工作正常但是当新数据添加到静态 observablecollection 时出现问题它不会反映到 UI(电话屏幕视图)。

请帮我解决这个问题和我的这部分代码:-

app启动时在这里检查加载的数据:-

public static ObservableCollection<DataTr> DataReceivedCollectionTr { get; set; }

private void load(object sender,RoutedEventArgs e)
{
    if (!IsDataLoaded)
    {
        GetOpentPos1(accountID);
    }          
    else
    {
        myListTrade.ItemsSource = DataReceivedCollectionTr;
    }
}

这里是调用:

private void GetOpentPos (string accountID)
{
    DataReceivedCollectionTr = new  ObservableCollection<DataTr>();
    myListTrade.ItemsSource = DataReceivedCollectionTr;

    string result1;
    try
    {
        var request = HttpWebRequest.Create(new Uri("http://MyIP/vertexweb10/webservice.svc/GetOpenPositions?AccountId="+accountID)) as HttpWebRequest;

        request.Method = "GET";

        if (request.Headers == null)
        {
            request.Headers = new WebHeaderCollection();
        }
        request.Headers[HttpRequestHeader.IfModifiedSince] = DateTime.UtcNow.ToString();
        request.CookieContainer = cookieJar2;
        request.BeginGetResponse(ar =>
            {
                HttpWebRequest req2 = (HttpWebRequest)ar.AsyncState;
                using (var response = (HttpWebResponse)req2.EndGetResponse(ar))
                {
                    using (Stream stream = response.GetResponseStream())
                    {
                        using (var reader = new StreamReader(stream))
                        {
                            var outerRoot4 = JsonConvert.DeserializeObject<OuterRootObject4>(reader.ReadToEnd());
                            JArray jsonArray = JArray.Parse(outerRoot4.d);
                            JToken jsonArray_Item = jsonArray.First;

                            DispatchInvoke(() =>
                            {
                                while (jsonArray_Item != null)
                                {
                                    int PosID = jsonArray_Item.Value<int>("ID");
                                    if (PosID > 0)
                                    {
                                        string SymbolNameTra = jsonArray_Item.Value<string>;
                                        // Here I add the Data 
                                        DataReceivedCollectionTr.Add(new DataTr() { SymbolNameTr = SymbolNameTra});
                                    }

                                    jsonArray_Item = jsonArray_Item.Next;
                                }
                            });
                        }
                    }
                }
            }, request);
    }
}

这是 XAML 代码:-

<Grid Background="#FF9AB5F9"
      x:Name="TradePanel"
      Grid.Row="1"
      Margin="0,70,0,-5">
    <ListBox Cursor="Hand"
             BorderBrush="Black"
             BorderThickness="1"
             Name="myListTrade"
             Background="#FF9AB5F9"
             Margin="0,-17,0,321">
        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <Setter Property="HorizontalContentAlignment"
                        Value="Stretch" />
            </Style>
        </ListBox.ItemContainerStyle>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid Margin="25,25,0,0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="2*" />
                        <ColumnDefinition Width="1*" />
                        <ColumnDefinition Width="1*" />
                        <ColumnDefinition Width="1*" />
                        <ColumnDefinition Width="0" />
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition />
                    </Grid.RowDefinitions>
                    <TextBlock x:Name="SymNameTr"
                               Text="{Binding  SymbolNameTr}"
                               Grid.Row="0"
                               Grid.Column="0"
                               HorizontalAlignment="Left"
                               Foreground="White"
                               FontSize="18"
                               FontWeight="Bold"
                               Margin="5,5,0,0" />
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

如果需要任何其他代码,请告诉我,以便我可以编辑问题

【问题讨论】:

  • 只是猜测:我认为当您向后导航时会创建一个新的数据透视页面实例,因此 IsDataLoaded 为 false 并再次加载。可能是这样吗?
  • IsDataLoaded 为真,任何其他建议
  • 好的,那么请发布更多代码。 DataReceivedCollectionTr 在哪里定义以及如何添加新数据(未出现在 UI 中)?
  • 谢谢你 Gerrit 的时间,但是你需要什么代码以及关于 DataReceivedCollectionTr 定义检查第一行代码以及我如何添加我使用的数据 DataReceivedCollectionTr.Add() 我已经添加了一个注释代码请检查。

标签: c# windows-phone-8 binding


【解决方案1】:

问题是你一直在打电话:

DataReceivedCollectionTr = new  ObservableCollection<DataTr>();
myListTrade.ItemsSource = DataReceivedCollectionTr;

在多个地方。您正在为每个分配名称的ListBox 执行此操作,并且您正在多个地方执行此操作。这是破坏绑定和重新分配,控件跟不上它。相反,只需创建一个在创建控件时初始化的字段。

private static ObservableCollection<DataTr> _drCollTr = new ObservableCollection<DataTr>();
public static ObservableCollection<DataTr> DataReceivedCollectionTr
{
    get
    {
        return _drCollTr;
    }
}

然后调用DataRecievedCollectionTr.Add.Remove/.Clear() 函数来更新列表。一旦您最初设置了 ItemsSource,您所要做的就是更改列表本身而不是控件的 ItemsSource。

我知道这是答案,因为我自己通过 TeamViewer 修复了您的代码 :)

【讨论】:

    猜你喜欢
    • 2014-04-21
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    相关资源
    最近更新 更多