【问题标题】:binding not being done with json data未使用 json 数据完成绑定
【发布时间】:2015-04-15 05:20:26
【问题描述】:

我有一个列表框,它的数据上下文设置为一个集合。在后台,我正在获取数据并将其提供给绑定元素。但这并没有体现在我的设计中。代码如下。

<ListBox Name="StatusListBox"
                 DataContext="{Binding StatusCollection}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <TextBlock Text="{Binding}" TextWrapping="Wrap"/>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

在我给出的页面定义中

DataContext="{Binding StatusViewModel, RelativeSource={RelativeSource Self}}"
d:DataContext="{Binding Source={d:DesignData Source=/Data/SampleData.json, Type=data:DataSource}}"

在 cs 文件中,我有一个 statusviewmodel,我给出了 statusviewmodel,即我获取的内容。

public ObservableDictionary StatusViewModel
    {
        get
        {
            return this.statusViewModel;
        }
    }

    private async void GetStatusOnline()
    {
        HttpWebRequest request = HttpWebRequest.Create(requestURI) as HttpWebRequest;
        WebResponse response = await request.GetResponseAsync();
        ObservableCollection<string> statusCollection = new ObservableCollection<string>();
        using (var reader = new StreamReader(response.GetResponseStream()))
        {
            string textcontent = reader.ReadToEnd();
            Debug.WriteLine(textcontent);
            DataSource dataSource = new DataSource();
            this.StatusViewModel["StatusCollection"] = dataSource.GetStatusCollection(textcontent);
        }
    }
private ObservableCollection<Status> _statusCollection = new ObservableCollection<Status>();
    public ObservableCollection<Status> StatusCollection
    {
        get
        {
            return this._statusCollection;
        }
    }
public IEnumerable<Status> GetStatusCollection(string textcontent)
    {
        JsonObject jsonObject = JsonObject.Parse(textcontent);
        JsonArray jsonArray = jsonObject["items"].GetArray();
        foreach (JsonValue value in jsonArray)
        {
            StatusCollection.Add(new Status(value.GetString()));
        }

        return StatusCollection;
    }

示例json数据为

{
"items": [
    "Hi\n",
    "This is my new status. How is this?\n",
    "This is thrid line."
]
}

【问题讨论】:

  • 您已将页面的 DataContext 设置为 ViewModel,但您的方法 GetStatusCollection 对不在 DataContext 中的变量进行操作i>,因此它可能不会对 UI 产生影响。您是否可以与该问题共享一个工作示例?
  • @Romasz 在导航中,我将 StatusViewModel 设置为具有键,并将值设置为可观察集合。该集合具有状态对象。 DataContext 中没有什么?我可以分享代码。但这几乎就是我在这里所拥有的。
  • 你试过 ?所以你在导航方法中设置它。如果我有一个工作样本,我会更容易查看它。

标签: json windows-phone-8 binding


【解决方案1】:

您没有设置ListBoxItemSource 属性。改变

DataContext="{Binding StatusCollection}"

ItemSource="{Binding StatusCollection}"

【讨论】:

  • 我都添加了,但列表框中没有结果。实际上,我从第 9 频道的 bob tabor tuts 的 ILoveCupCakes 应用程序中获得了灵感。
【解决方案2】:

好的,我会试试这个。 查看 Listbox.ItemTemplate 和 DataContext 的 XAML 代码, 您已将数据上下文设置为 Binding StatusCollection,并且在您的页面定义中,您将 DataContext 作为 Binding StatusViewModel。以及 d:DataContext 是 {Binding Source={d:DesignData Source=/Data/SampleData.json, Type=data:DataSource}

问题在于 TextBlock 的 Listbox 的 ItemTemplate。由于您将文本设置为简写的 {Binding},因此假设 DataContext 用于 StatusCollection。实际上,您想要的数据上下文是 JSON 文件的 DesignData 源。

所以我建议更改您的 StatusViewModel 以反映调用 JSON 文件,否则您的代码会脱节,而您的 JSON 文件永远不会被实际读取。

【讨论】:

  • 设计数据可忽略。只有列表框的项目来源有误。我不应该同时将数据上下文和项目源都提供给列表框。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 2017-01-21
  • 1970-01-01
  • 2012-07-27
  • 2012-07-16
相关资源
最近更新 更多