2017-03-03 20 views
3

我有一个手动创建列表的工作解决方案。 但是由于我想从文件中读取数据,因此我必须更改为异步,并且由于未来数据量将更改为ObservableCollection,因此XAML不再显示9行。UWP#没有显示ListView.ItemTemplate,因为我从列表更改为ObservableCollection和异步

调试我看到{x:Bind Accounts}仍然包含9行和两个值。但帐号名称SumAccountName数据不是没有列出。只有页眉和页脚。 现在我花了几个小时比较两种解决方案,但不知道为什么这个不显示数据。

Overview.xaml:

x:Class="Finance_Manager.Overview" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="using:Finance_Manager" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:data="using:Finance_Manager.Models" 
mc:Ignorable="d"> 

<StackPanel> 
     <Grid Margin="20,20,20,20" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Loaded="Grid_Loaded"> 
     <ListView ItemsSource="{x:Bind Accounts}" IsItemClickEnabled="True" ItemClick="ListView_ItemClick"> 
      <ListView.ItemContainerStyle> 
       <Style TargetType="ListViewItem"> 
        <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
       </Style> 
      </ListView.ItemContainerStyle> 
      <ListView.Header> 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="4*" /> 
         <ColumnDefinition Width="1*" /> 
        </Grid.ColumnDefinitions> 
        <TextBlock FontWeight="Bold" Text="Konto" /> 
        <TextBlock Grid.Column="1" FontWeight="Bold" Text="Total" TextAlignment="Right"/> 
       </Grid> 
      </ListView.Header> 
      <ListView.ItemTemplate> 
       <DataTemplate x:DataType="data:Account"> 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="4*" /> 
          <ColumnDefinition Width="1*" /> 
         </Grid.ColumnDefinitions> 
         <TextBlock Text="{x:Bind AccountName}" /> 
         <TextBlock Grid.Column="1" Text="{x:Bind SumAccountName}" TextAlignment="Right"/> 
        </Grid> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
      <ListView.Footer> 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="4*" /> 
         <ColumnDefinition Width="1*" /> 
        </Grid.ColumnDefinitions> 
        <TextBlock FontWeight="Bold" Text="Gesamtvermögen" /> 
        <!-- <TextBlock Grid.Column="1" FontWeight="Bold" x:Name="SumTextBlock" TextAlignment="Right"/> --> 
        <TextBlock Grid.Column="1" FontWeight="Bold" Text="CHF 326'979.74" TextAlignment="Right"/> 
       </Grid> 
      </ListView.Footer> 
     </ListView> 
    </Grid> 
    <Grid> 
     <TextBlock Margin="20,80,0,0" x:Name="TextBlockClicked" TextWrapping="Wrap" VerticalAlignment="Bottom" /> 
    </Grid> 
    </StackPanel> 

Accounts.cs:

namespace Finance_Manager.Models 
{ 
    public class Account 
    { 
     public string AccountName { get; set; } 
     public double SumAccountName { get; set; } 
    } 

    public class AccountOverview 
    { 
     public static async Task<ObservableCollection<Account>> GetAccounts() 
     { 
      var accounts = new ObservableCollection<Account>(); 

      // 
      // Load file 
      var folder = ApplicationData.Current.LocalFolder; 
      var GetOverviewFile = await folder.GetFileAsync("overview.json"); 
      string jsonString = await FileIO.ReadTextAsync(GetOverviewFile); 
      // 

      JsonArray root = JsonValue.Parse(jsonString).GetArray(); 
      for (uint i = 0; i < root.Count; i++) 
      { 
       string account1 = root.GetObjectAt(i).GetNamedString("account"); 
       double sumaccount1 = root.GetObjectAt(i).GetNamedNumber("sumaccount"); 
       accounts.Add(new Account { AccountName = account1, SumAccountName = sumaccount1 }); 
      }; 

      //accounts.Add(new Account { AccountName = "Bank1", SumAccountName = 100.00 }); 
      //accounts.Add(new Account { AccountName = "Bank2", SumAccountName = 100.00 }); 
      //accounts.Add(new Account { AccountName = "Bank3", SumAccountName = 100.00 }); 
      //accounts.Add(new Account { AccountName = "Bank4", SumAccountName = 100.00 }); 
      //accounts.Add(new Account { AccountName = "Bank5", SumAccountName = 100.00 }); 
      //accounts.Add(new Account { AccountName = "Bank6", SumAccountName = 100.00 }); 
      //accounts.Add(new Account { AccountName = "Bank7", SumAccountName = 100.00 }); 
      //accounts.Add(new Account { AccountName = "Bank8", SumAccountName = 100.00 }); 
      //accounts.Add(new Account { AccountName = "Bank9", SumAccountName = 100.00 }); 

      return accounts; 
     } 
    } 
} 

Overview.xaml.cs:

namespace Finance_Manager 
{ 
    /// <summary> 
    /// An empty page that can be used on its own or navigated to within a Frame. 
    /// </summary> 
    public sealed partial class Overview : Page 
    { 

     public ObservableCollection<Account> Accounts; 

     public Overview() 
     { 
      this.InitializeComponent(); 
     } 

     public async void Grid_Loaded(object sender, RoutedEventArgs e) 
     { 
      Accounts = await AccountOverview.GetAccounts(); 
     } 
    } 
} 

回答

1

所有绑定的先用性质不字段(只工作您的ObservableCollection帐户只是字段)。

而另一个问题可能是Accounts属性将为null当XAML是加载,所以你可能需要this.InitializeComponents();之前添加Accounts = new ObservableCollection<Accounts>();,也不会从AccountOverview.GetAccounts();方法返回的ObservableCollection的全新的实例,但只填充已存在的对象。

+0

感谢您的回答! 现在我挣扎了一下。我使用Channel9的“绝对初学者Windows 10开发”的例子。 我如何将帐户从一个字段更改为一个属性?没有找到与我的看法不同的例子。 –

+0

在你的情况下,只需更改'公众ObservableCollection 帐户;'公共ObservableCollection 帐户{获取;组; }' –

1

1)您Accounts字段更改为财产

2)如果您使用的绑定,您应该实现INotifyPropertyChanged并调用OnPropertyChanged()每次改变Accounts属性。这将更新View。

3)默认x:Bind使用mode=OneTime,您应该将其更改为Mode=OneWay

如果您想要最快最简单的解决方案,请删除绑定,然后执行ListView.ItemSource = MyClass.GetAccounts()。这对MVVM模式并不好,但我发现你使用的是后面的代码。

+0

要将字段更改为属性非常简单 - 'public ObservableCollection Accounts {get;设置;}' –

0

我都解释了,但它仍然无法正常工作。

我将Name="AccountList"添加到Overview.xaml中的ListView。和Overview.xaml.cs中的AccountList.ItemSource = Accounts;。现在它可以工作。

相关问题