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>

最後に、DataSourceCapitulos の ListaCapitulos プロパティを指すソースアイテムを含む GridView:

    <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>

ここまで私のアプリは問題なく実行されますが、問題はアイテムが表示されないことです。

これは 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. グリッドビュー (チャプターを表示する XAML にあるもの)DataContextをそのインスタンスに設定します。これは C# で行うことができますChaptersGridView.DataContext = ChaptersVm

にチャプターがあることを知っているということは、表示するためにチャプターをListaCapitulos正しくバインドしなかったことを意味します。

また、async void CargarCapitulos()非同期であることを意図しており、コンストラクターで呼び出していますが、同期的に実行されます。チャプターを収集するときに、アプリが流動的に実行されない場合があります。

アップデート

最初の方法についてはよくわかりませんが、Cargar Capitulos非同期の呼び出しを維持できる 2 つの方法を考えることができます。

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 アプリの高度なテンプレートを使用した場合は、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 に表示されるはずです。

ただし、通知の変更が有効になるように実装する必要があると思います。それ以外の場合は、Observable Collection の代わりに Capitulos の単純な List (奇妙なスペイン語) を使用できたはずです。

于 2013-06-23T09:52:17.260 に答える
0

ビュー(xaml フォーム)は、このバインドによるデータの変更を認識していないと思います。なぜ静的リソースを使用しているのですか? ListaCapitulos を girid のデータ ソースに直接設定できます。それ以外の場合は、MVVM モデルを使用する必要があり、プロパティの変更のビューに注意する必要があります。

于 2013-06-23T06:47:02.457 に答える