C# 如何将多个阵列绑定到数据网格
我有一个角色对象,其中我有10个数组,代表角色的10个统计数据(敏捷度、强度等-这是角色扮演游戏)。数组跟踪状态并随时间增加,因此我知道它们在哪个级别增加哪个状态。数组是有限的,我跟踪到50级,所以我不需要跟踪可变数量的行或列。一切都是固定的 e、 g.字符串[]敏捷性=新字符串[50] 我希望在DataGrid中显示此信息,并将每行中的每个单元格绑定到每个stat数组的一个元素。我找到并尝试了一个我认为是我最大的希望的库,一个名为DataGrid2D的库,但我没有尽全力让它工作。当我试图更改DataGrid中的值时,我会得到一个错误:双向绑定需要Path或XPath。当我从列表框中选择角色时,10x50网格被填充,甚至填充也需要几秒钟 在此处找到DataGrid2D示例:。我使用了Meleak的答案(第二个倒数),将m_intArray更改为一个2D数组,该数组由每个属性(c.stats)创建C# 如何将多个阵列绑定到数据网格,c#,wpf,data-binding,datagrid,C#,Wpf,Data Binding,Datagrid,我有一个角色对象,其中我有10个数组,代表角色的10个统计数据(敏捷度、强度等-这是角色扮演游戏)。数组跟踪状态并随时间增加,因此我知道它们在哪个级别增加哪个状态。数组是有限的,我跟踪到50级,所以我不需要跟踪可变数量的行或列。一切都是固定的 e、 g.字符串[]敏捷性=新字符串[50] 我希望在DataGrid中显示此信息,并将每行中的每个单元格绑定到每个stat数组的一个元素。我找到并尝试了一个我认为是我最大的希望的库,一个名为DataGrid2D的库,但我没有尽全力让它工作。当我试图更改D
var c=CE\u Characters\u charactersLB.选择editem作为字符;
var dg=CE_字符_statsDG;
dg.ItemsSource=GetBindable2DArray(c.Stats);
有没有更有效的解决方案?或者有人知道我为什么会在DataGrid2D中出现路径错误吗?来自您发布的链接:“它将DataGrid子类化,并添加一个名为ItemsSource2D的属性,用于绑定2D或1D源”
因此,我想您必须使用该库提供的DataGrid并使用ItemsSource2D属性我有一个类似的问题,请查看我的线程: 我也有一个固定的amout,需要一个双向绑定,因此我定义了一个固定的列和行的amout,并将Column和Row属性动态地分配给ItemsControl内的TextBlock 这是密码
<ItemsControl ItemsSource="{Binding Path=CustomerTankDayStructure,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
Grid.Column="1"
Grid.Row="2">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid helper:EnterKeyTraversal.IsEnabled="True"
KeyboardNavigation.TabNavigation="Local">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0" />
[...]
<ColumnDefinition Width="30" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="0" />
<RowDefinition Height="30" />
[...]
<RowDefinition Height="30" />
</Grid.RowDefinitions>
</Grid>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Grid.Column" Value="{Binding Path=DoW}" />
<Setter Property="Grid.Row" Value="{Binding Path=HoD}" />
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderThickness="0,0,1,1"
Style="{StaticResource ResourceKey=DefaultBorder}">
<TextBox BorderThickness="0"
MaxLength="3"
Style="{StaticResource ResourceKey=EditableTextBoxWithoutWarningForTanks}"
TextAlignment="Center"
VerticalContentAlignment="Center"
IsTabStop="True">
<TextBox.TabIndex>
<MultiBinding Converter="{StaticResource ResourceKey=CustomerTankTabIndexConverter}">
<Binding Path="DoW" />
<Binding Path="HoD" />
</MultiBinding>
</TextBox.TabIndex>
<TextBox.Text>
<Binding Path="Value"
Mode="TwoWay"
NotifyOnValidationError="True"
TargetNullValue=""
UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<validator:Int32Validator Mandatory="True"
Min="0"
Max="100" />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
[...]
[...]
这有点“脏代码”,但对于这个问题,我没有找到任何其他解决方案:)我花了很长时间才弄明白为什么你的程序不工作 基本上,如果我是正确的,您的角色类将如下所示:
public class Character
{
public string Name { get; set; }
public int Level { get; set; }
public int[] Agility { get; set; }
public int[] Strength { get; set; }
public int[] Stamina { get; set; }
public int[] Intelligence { get; set; }
}
public class Character
{
public string Name { get; set; }
public int Level { get; set; }
public List<Stat> Stats { get; set; }
public Character()
{
}
public class Stat
{
public int Agility { get; set; }
public int Strength { get; set; }
public int Intelligence { get; set; }
public int Stamina { get; set; }
}
}
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<ComboBox Margin="5,5,5,5" DisplayMemberPath="Name" Grid.Row="0" ItemsSource="{Binding Path=Characters}" SelectedItem="{Binding Path=SelectedCharacter}"></ComboBox>
<DataGrid Grid.Row="1" Margin="5,5,5,5" AutoGenerateColumns="True" ItemsSource="{Binding Path=SelectedCharacter.Stats}" >
<DataGrid.Columns>
<DataGridTextColumn Header="Agility" Binding="{Binding Path=Agility}"></DataGridTextColumn>
<DataGridTextColumn Header="Strength" Binding="{Binding Path=Strength}"></DataGridTextColumn>
<DataGridTextColumn Header="Intelligence" Binding="{Binding Path=Intelligence}"></DataGridTextColumn>
<DataGridTextColumn Header="Stamina" Binding="{Binding Path=Stamina}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
Datagrid无法处理这些stat属性的原因是它们彼此独立。它不知道如何基于几个不同的属性创建行
正如Nathan Cooper之前指出的,您真正需要的是另一个名为Stat(或类似的东西)的类,它可以将这些属性中的每一个都作为int来存放。然后,需要这些类的集合来将datagrid绑定到
这样想吧。您当前已将数据垂直分组到列中。数据网格用于将数据分组到行中。因此,您需要一组表示行的对象
我花了时间创建了一个示例应用程序,它将展示这个概念的工作原理
角色类如下所示:
public class Character
{
public string Name { get; set; }
public int Level { get; set; }
public int[] Agility { get; set; }
public int[] Strength { get; set; }
public int[] Stamina { get; set; }
public int[] Intelligence { get; set; }
}
public class Character
{
public string Name { get; set; }
public int Level { get; set; }
public List<Stat> Stats { get; set; }
public Character()
{
}
public class Stat
{
public int Agility { get; set; }
public int Strength { get; set; }
public int Intelligence { get; set; }
public int Stamina { get; set; }
}
}
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<ComboBox Margin="5,5,5,5" DisplayMemberPath="Name" Grid.Row="0" ItemsSource="{Binding Path=Characters}" SelectedItem="{Binding Path=SelectedCharacter}"></ComboBox>
<DataGrid Grid.Row="1" Margin="5,5,5,5" AutoGenerateColumns="True" ItemsSource="{Binding Path=SelectedCharacter.Stats}" >
<DataGrid.Columns>
<DataGridTextColumn Header="Agility" Binding="{Binding Path=Agility}"></DataGridTextColumn>
<DataGridTextColumn Header="Strength" Binding="{Binding Path=Strength}"></DataGridTextColumn>
<DataGridTextColumn Header="Intelligence" Binding="{Binding Path=Intelligence}"></DataGridTextColumn>
<DataGridTextColumn Header="Stamina" Binding="{Binding Path=Stamina}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
公共类字符
{
公共字符串名称{get;set;}
公共整数级别{get;set;}
公共列表统计信息{get;set;}
公共性质()
{
}
公共类统计
{
公共属性{get;set;}
公共整数强度{get;set;}
公共int智能{get;set;}
公共int耐力{get;set;}
}
}
在这里你可以看到我创建了一个类似于Nathan所说的Stat类。就像我说的,这个类将容纳datagrid的“行”,这样数据就可以以datagrid可以轻松理解的方式进行分组
表单的XAML如下所示:
public class Character
{
public string Name { get; set; }
public int Level { get; set; }
public int[] Agility { get; set; }
public int[] Strength { get; set; }
public int[] Stamina { get; set; }
public int[] Intelligence { get; set; }
}
public class Character
{
public string Name { get; set; }
public int Level { get; set; }
public List<Stat> Stats { get; set; }
public Character()
{
}
public class Stat
{
public int Agility { get; set; }
public int Strength { get; set; }
public int Intelligence { get; set; }
public int Stamina { get; set; }
}
}
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<ComboBox Margin="5,5,5,5" DisplayMemberPath="Name" Grid.Row="0" ItemsSource="{Binding Path=Characters}" SelectedItem="{Binding Path=SelectedCharacter}"></ComboBox>
<DataGrid Grid.Row="1" Margin="5,5,5,5" AutoGenerateColumns="True" ItemsSource="{Binding Path=SelectedCharacter.Stats}" >
<DataGrid.Columns>
<DataGridTextColumn Header="Agility" Binding="{Binding Path=Agility}"></DataGridTextColumn>
<DataGridTextColumn Header="Strength" Binding="{Binding Path=Strength}"></DataGridTextColumn>
<DataGridTextColumn Header="Intelligence" Binding="{Binding Path=Intelligence}"></DataGridTextColumn>
<DataGridTextColumn Header="Stamina" Binding="{Binding Path=Stamina}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>