0

我正在开发一个 Win8 应用程序:

我有一个通过 json 从 web 服务获取项目的数据源类:

public class DataSourceCapitulos
{
    public ObservableCollection<capitulo> ListaCapitulos { get; set; }
    public DataSourceCapitulos()
    {
        CargarCapitulos();
    }


    public async void CargarCapitulos()
    {
        var resourceUri = Cie10Uri.CapitulosUri;
        HttpClient httpClient = new HttpClient();
        bool error = false;
        HttpRequestException exception = null;
        try
        {
            string response = await httpClient.GetStringAsync(resourceUri);
            ListaCapitulos = new ObservableCollection<capitulo>(JsonConvert.DeserializeObject<List<capitulo>>(response));
        }
        catch (HttpRequestException e)
        {
            error = true;
            exception = e;
        }
        if (error)
        {
            MessageDialog adv = new MessageDialog(string.Format("La consulta {0}, devolvió:{1}", resourceUri, exception.Message), "No se pudo consultar!!! ");
            adv.Commands.Add(
                new UICommand("Ok")
            );
            await adv.ShowAsync();
        }
    }
}

并有一个具有此来源的 XAML 表单:

<Page.Resources>
    <data:DataSourceCapitulos x:Key="DataSourceCapitulos"></data:DataSourceCapitulos>
</Page.Resources>

最后是一个 GridView,它的源项目指向 DataSourceCapitulos 的 ListaCapitulos 属性,如下所示:

    <GridView Grid.Column="1" Grid.Row="1" ItemsSource="{Binding Source={StaticResource DataSourceCapitulos},Path=ListaCapitulos}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid Height="250" Width="250">
                    <Grid.Background>
                        <ImageBrush ImageSource="{Binding Imagen}"/>
                    </Grid.Background>
                    <Grid.RowDefinitions>
                        <RowDefinition/>
                        <RowDefinition Height="90"/>
                    </Grid.RowDefinitions>
                    <Rectangle >
                        <Rectangle.Fill>
                            <SolidColorBrush Color="#FF122951" Opacity="0.6"/>
                        </Rectangle.Fill>
                    </Rectangle>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </GridView>

直到这里我的应用程序运行没有问题,但问题是它没有显示项目,甚至 ListaCapitulos 也如我预期的那样填充。

这是 MainPage.xaaml.cs

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
    }

    /// <summary>
    /// Se invoca cuando esta página se va a mostrar en un objeto Frame.
    /// </summary>
    /// <param name="e">Datos de evento que describen cómo se llegó a esta página. La propiedad Parameter
    /// se usa normalmente para configurar la página.</param>
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
    }
}

有什么我想念的吗?

4

2 回答 2

1
  1. 在 XAML 中,设置ItemsSource="{Binding listaCapitulos}(ObservableCollection)。

  2. 在页面的 C# 文件中,您需要一个 class 实例DataSourceCapitulos,例如DataSourceCapitulos ChaptersVm = new DataSourceCapitulos();(作为成员,您需要多次访问它)。

  3. 将gridview(你在XAML中应该显示章节的那个)DataContext设置为那个实例。您可以在 C# 中执行此操作,ChaptersGridView.DataContext = ChaptersVm.

你是说你知道你有 中的章节ListaCapitulos,这意味着你没有正确绑定它们以显示。

另外,我看到async void CargarCapitulos()它是异步的,你在构造函数中调用它,但会同步运行。收集章节时,您的应用程序可能无法流畅运行。

更新

虽然我不太确定第一种方法,但我可以想到两种方法可以保持Cargar Capitulos异步调用。

1)等待新方法中的方法调用(我不太确定这会成功):

在构造函数中:

public DataSourceCapitulos()
{
    LoadCapitulos();
}

LoadCapitulos你的身体在哪里:

public async void LoadCapitulos()
{
    //this awaits the chapters to load (you were missing await,
    //but you can't use await in a constructor, so this is a work-around
    await CargarCapitulos(); 
}

如果 1) 不起作用,请尝试 2​​) 肯定会起作用,但您必须进行一些更改:

2) 如果您对包含章节的集合进行了一些更改,您的 ObservableCollection 将不会通知 UI 任何更新。为此,您必须使用INotifyPropertyChanged接口并实现其成员。如果您使用了 Windows 8 App 的高级模板,在Common文件夹中,您有一个名为的类BindableBase- 尝试通过继承它直接使用它。此外,您必须OnPropertyChanged()在 setter 中使用事件调用ObservableCollection,这样当章节集合发生变化时,UI 也会通过绑定发生变化:

public class DataSourceCapitulos : BindableBase
{
    private ObservableCollection <capitulo> _listaCapitulos;
    public ObservableCollection <capitulo> ListaCapitulos
    {
        get 
        {
            return _listaCapitulos;
        }
        set
        {
            _listaCapitulos = value;
            OnPropertyChanged(); //This notifies of changes of collection
        }
     }

但是,如果您没有 BindableBase,只需实现INotifyPropertyChanged,其余部分看起来就像我之前写的一样。通过这些提供通知的更改,章节应该显示在 UI 上,即使它们稍后加载,在 UI 加载之后。

但我会说你应该实现它以使通知更改产生任何效果。否则,您可以使用简单的 Capitulos 列表(怪异的西班牙语)而不是 Observable Collection。

于 2013-06-23T09:52:17.260 回答
0

我认为视图(xaml 表单)没有通过此绑定了解数据更改。为什么要使用静态资源?您可以直接将 ListaCapitulos 设置为 girid 的数据源,否则,您应该使用 MVVM 模型,并且您应该了解您对属性更改的看法。

于 2013-06-23T06:47:02.457 回答