我正在开发一个Win8应用程序:
我有一个数据源类,通过json从webservice获取temtem:
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,它的源ítems指向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>
直到这里我的应用程序运行没有问题,但问题是它没有显示teítems,甚至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)
{
}
}
有什么我错过的?
答案 0 :(得分:1)
在XAML中,设置ItemsSource="{Binding listaCapitulos}
(ObservableCollection)。
在页面的C#文件中,您需要一个类DataSourceCapitulos
的实例,例如DataSourceCapitulos ChaptersVm = new DataSourceCapitulos();
(作为成员,您需要多次访问它)。
为该实例设置gridview(在XAML中应该显示章节的那个)DataContext
。您可以使用C#,ChaptersGridView.DataContext = ChaptersVm
。
你说你知道你有ListaCapitulos
中的章节,这意味着你没有正确绑定它们以便显示。
另外,我看到async void CargarCapitulos()
意味着异步,你在构造函数中调用它,但会同步运行。在收集章节时,您的应用可能无法流畅运行。
更新
Altough我不太确定第一种方式,我可以想到两种方法可以保持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。
答案 1 :(得分:0)
我认为视图(xaml表单)没有通过此绑定了解数据更改。 为什么使用静态资源? 你可以直接将ListaCapitulos设置为girid的数据源,否则你应该使用MVVM模型,你应该知道你对属性变化的看法。