如何在Xamarin.Forms.DataGrid中把字典值设为列的PropertyName?
问题:Xamarin.Forms.DataGrid动态生成列时出现属性绑定找不到报错
使用Xamarin.Forms.DataGrid通过循环动态生成列,其中kvp.Value返回数组,尝试将数组元素设置为列的PropertyName,期望实现Key1,Value[1], Key2,Value[2]的输出格式,但控制台报错:
Binding: 'status' property not found on
相关代码
C# 代码
foreach (KeyValuePair<string, string[]> kvp in myDictionary3) { for (int i = 0; i < kvp.Value.Length; i++) { DataGridColumn dataGridColumn = new DataGridColumn() { Title = kvp.Key, PropertyName = kvp.Value[i], }; dataColumn.Columns.Add(dataGridColumn); } }
XAML 代码
<ScrollView Orientation="Both" Grid.ColumnSpan="2" Grid.RowSpan="4"> <dg:DataGrid ItemsSource="{Binding RoomTypes}" x:Name="dataColumn" SelectionEnabled="True" SelectedItem="{Binding SelectedRoom}" RowHeight="70" HeaderHeight="50" BorderColor="#CCCCCC" HeaderBackground="#E0E6F8" PullToRefreshCommand="{Binding RefreshCommand}" IsRefreshing="{Binding IsRefreshing}"> <dg:DataGrid.HeaderFontSize> <OnIdiom x:TypeArguments="x:Double"> <OnIdiom.Tablet>15</OnIdiom.Tablet> <OnIdiom.Phone>13</OnIdiom.Phone> </OnIdiom> </dg:DataGrid.HeaderFontSize> <dg:DataGrid.Columns> <dg:DataGridColumn PropertyName="Name" Width="3*" > <dg:DataGridColumn.FormattedTitle> <FormattedString> <Span Text="Room Type" FontSize="13" TextColor="Black" FontAttributes="Bold" /> </FormattedString> </dg:DataGridColumn.FormattedTitle> </dg:DataGridColumn> </dg:DataGrid.Columns> <dg:DataGrid.RowsBackgroundColorPalette> <dg:PaletteCollection> <Color>#F2F2F2</Color> <Color>#FFFFFF</Color> </dg:PaletteCollection> </dg:DataGrid.RowsBackgroundColorPalette> </dg:DataGrid> </ScrollView>
解决方案
确认实体类属性存在
报错提示的status属性不存在于RoomTypes集合的实体类中,需检查实体类是否定义了所有kvp.Value数组中包含的属性,属性名需完全匹配(C#属性名大小写敏感)。例如:public string Status { get; set; } // 确保属性名与PropertyName的字符串一致调整动态列生成时机
必须在RoomTypes数据源加载完成后再执行列生成逻辑,避免数据源未初始化导致绑定失败。可在ViewModel的RoomTypes集合填充完成后触发,或在页面的OnAppearing方法中执行列生成代码。验证字典中属性名的正确性
打印kvp.Value[i]的内容,确认每个值都是实体类中真实存在的属性名,排查拼写错误或无效字符串。处理嵌套属性绑定(若有)
如果要绑定的是嵌套对象的属性,需使用正确的绑定路径格式,比如NestedObject.Status,而非直接写status。
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

