【发布时间】:2019-11-09 18:52:38
【问题描述】:
我正在尝试使用来自 ObservableCollection 的数据在 UWP(来自社区工具包包)中加载 DataGrid。显示读取数据的 CSV 文件的标题,但由于某种原因,没有显示任何数据行。我已经通读并尝试了至少 5 或 6 个关于 SO 的问题,所以虽然我知道以前有人问过这个问题,但这些答案似乎不起作用。
在这一点上,我对自己做错了什么感到不知所措。我知道我的代码中有一些错误(显然或者它会起作用),但我似乎无法追踪它。有人可以看看下面的代码,看看他们是否能发现任何错误?
注意:我知道数据被正确读取,因为 a) 标题显示出来了,b) 我已经打断点并查看了 SpellBook 中的数据,它包含 408 个项目。
提前感谢任何可以提供帮助的人!
C#
public sealed partial class SpellPageBase : Page
{
public ObservableCollection<Spell> SpellBook { get; set; }
public List<Spell> spellData { get; set; }
public static readonly DependencyProperty ComponentsProperty =
DependencyProperty.Register("Components", typeof(string), typeof(SpellPageBase), new PropertyMetadata("Components"));
public static readonly DependencyProperty DescriptionProperty =
DependencyProperty.Register("Description", typeof(string), typeof(SpellPageBase), new PropertyMetadata("Description"));
public static readonly DependencyProperty HighChangesProperty =
DependencyProperty.Register("HighChanges", typeof(string), typeof(SpellPageBase), new PropertyMetadata("HighLevelChanges"));
public static readonly DependencyProperty HighDescriptionProperty =
DependencyProperty.Register("HighDescription", typeof(string), typeof(SpellPageBase), new PropertyMetadata("HighLevelDescription"));
public static readonly DependencyProperty SchoolLevelProperty =
DependencyProperty.Register("SpellLevel", typeof(int), typeof(SpellPageBase), new PropertyMetadata(0));
public static readonly DependencyProperty IsRitualProperty =
DependencyProperty.Register("IsRitual", typeof(bool), typeof(SpellPageBase), new PropertyMetadata(false));
public static readonly DependencyProperty SchoolProperty =
DependencyProperty.Register("School", typeof(string), typeof(SpellPageBase), new PropertyMetadata("School"));
public static readonly DependencyProperty SpellNameProperty =
DependencyProperty.Register("SpellName", typeof(string), typeof(SpellPageBase), new PropertyMetadata("Name"));
public string Components
{
get { return (string)GetValue(ComponentsProperty); }
set { SetValue(ComponentsProperty, value); }
}
public string Description
{
get { return (string)GetValue(DescriptionProperty); }
set { SetValue(DescriptionProperty, value); }
}
public string HighChanges
{
get { return (string)GetValue(HighChangesProperty); }
set { SetValue(HighChangesProperty, value); }
}
public string HighDescription
{
get { return (string)GetValue(HighDescriptionProperty); }
set { SetValue(HighDescriptionProperty, value); }
}
public bool IsRitual
{
get { return (bool)GetValue(IsRitualProperty); }
set { SetValue(IsRitualProperty, value); }
}
public string School
{
get { return (string)GetValue(SchoolProperty); }
set { SetValue(SchoolProperty, value); }
}
public int SchoolLevel
{
get { return (int)GetValue(SchoolLevelProperty); }
set { SetValue(SchoolLevelProperty, value); }
}
public string SpellName
{
get { return (string)GetValue(SpellNameProperty); }
set { SetValue(SpellNameProperty, value); }
}
public SpellPageBase()
{
SpellBook = new ObservableCollection<Spell>();
this.InitializeComponent();
DataContext = this;
//Load();
//ReadFile();
}
public void ReadFile()
{
using (CsvReader csv = new CsvReader(new StreamReader("Assets\\Spells5thEdition.csv"), true))
{
int fieldCount = csv.FieldCount;
string[] headers = csv.GetFieldHeaders();
while(csv.ReadNextRecord())
{
string key = csv[0];
string name = csv[1];
bool isRitual = csv[2] == "1" ? true : false;
string ritualName = csv[3];
int level = int.Parse(csv[4]);
Enum.TryParse(csv[5], out School school);
//int school = new School(int.Parse(csv[5]));
string schoolLevel = csv[6];
string castingTime = csv[7];
string range = csv[8];
string duration = csv[9];
string components = csv[10];
string materials = csv[11];
string description = csv[12];
string higherLevelMods = csv[13];
string higherLevelDescription = csv[14];
string save = csv[15];
string classes = csv[16];
string sourceBook = csv[17];
string page = csv[18];
string bookPage = csv[19];
spellData.Add(new Spell(key, name, isRitual, ritualName, level, school, schoolLevel, castingTime, range, duration, components, materials, description, higherLevelMods, higherLevelDescription, save, classes, sourceBook, page, bookPage));
}
}
ObservableCollection<Spell> spellBook = new ObservableCollection<Spell>(spellData);
}
private void Page_Loaded(object sender, RoutedEventArgs e)
{
this.spellData = new List<Spell>();
ReadFile();
//foreach(Spell s in spellData)
//{
// SpellBook.Add(s);
//}
this.spellsList.DataContext = this.SpellBook;
spellsList.ItemsSource = SpellBook;
spellsList.UpdateLayout();
}
}
XAML
<Page
x:Class="DungeoneerKit.SpellPageBase"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:DungeoneerKit"
xmlns:tk="using:Microsoft.Toolkit.Uwp.UI.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Loaded="Page_Loaded"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid>
<Grid.Resources>
<DataTemplate x:Key="RowDetailsTemplate">
<StackPanel>
<TextBlock Text="Spell Details:" Margin="10" />
<Grid Margin="20, 10" Padding="5">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="Description: " FontWeight="SemiBold" FontSize="13" />
<TextBlock Grid.Row="1" Grid.Column="0" Text="At High-Levels: " FontWeight="SemiBold" FontSize="13" />
<TextBlock Grid.Row="2" Grid.Column="0" Text="High-Level Description: " FontWeight="SemiBold" FontSize="13" />
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Description}" FontSize="13" />
<TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding HighDescription}" FontSize="13" />
<TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding HighChanges}" FontSize="13" />
</Grid>
</StackPanel>
</DataTemplate>
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<tk:DataGrid x:Name="spellsList"
Height="900"
Foreground="White"
DataContext="{Binding SpellBook}"
ItemsSource="{Binding SpellBook}"
Grid.Row="1"
Margin="12"
VerticalAlignment="Stretch"
HorizontalAlignment="Stretch"
HorizontalScrollBarVisibility="Visible"
VerticalScrollBarVisibility="Visible"
AlternatingRowBackground="Transparent"
AlternatingRowForeground="Gray"
AreRowDetailsFrozen="False"
AutoGenerateColumns="True"
CanUserSortColumns="True"
CanUserResizeColumns="True"
CanUserReorderColumns="True"
ColumnHeaderHeight="32"
MaxColumnWidth="400"
IsReadOnly="False"
RowDetailsTemplate="{StaticResource RowDetailsTemplate}"
RowDetailsVisibilityMode="VisibleWhenSelected"
SelectionMode="Extended">
<!--<tk:DataGrid.Columns>
<tk:DataGridTextColumn Header="Spell Name" Binding="{Binding SpellName}" />
<tk:DataGridCheckBoxColumn Header="Ritual" Binding="{Binding IsRitual}" />
<tk:DataGridTextColumn Header="Level-School" Binding="{Binding SchoolLevel}" />
<tk:DataGridTextColumn Header="Components" Binding="{Binding Components}" />
</tk:DataGrid.Columns>-->
</tk:DataGrid>
</Grid>
【问题讨论】:
-
请尝试删除此行
this.spellsList.DataContext = this.SpellBook;。 -
而且你不需要为页面创建依赖属性,我检查了
tk:DataGridTextColumn的绑定属性不正确。 -
你需要来自
Spell类的绑定属性。
标签: c# uwp datagrid observablecollection windows-community-toolkit