C# 如何将多个阵列绑定到数据网格

C# 如何将多个阵列绑定到数据网格,c#,wpf,data-binding,datagrid,C#,Wpf,Data Binding,Datagrid,我有一个角色对象,其中我有10个数组,代表角色的10个统计数据(敏捷度、强度等-这是角色扮演游戏)。数组跟踪状态并随时间增加,因此我知道它们在哪个级别增加哪个状态。数组是有限的,我跟踪到50级,所以我不需要跟踪可变数量的行或列。一切都是固定的 e、 g.字符串[]敏捷性=新字符串[50] 我希望在DataGrid中显示此信息,并将每行中的每个单元格绑定到每个stat数组的一个元素。我找到并尝试了一个我认为是我最大的希望的库,一个名为DataGrid2D的库,但我没有尽全力让它工作。当我试图更改D

我有一个角色对象,其中我有10个数组,代表角色的10个统计数据(敏捷度、强度等-这是角色扮演游戏)。数组跟踪状态并随时间增加,因此我知道它们在哪个级别增加哪个状态。数组是有限的,我跟踪到50级,所以我不需要跟踪可变数量的行或列。一切都是固定的

e、 g.字符串[]敏捷性=新字符串[50]

我希望在DataGrid中显示此信息,并将每行中的每个单元格绑定到每个stat数组的一个元素。我找到并尝试了一个我认为是我最大的希望的库,一个名为DataGrid2D的库,但我没有尽全力让它工作。当我试图更改DataGrid中的值时,我会得到一个错误:双向绑定需要Path或XPath。当我从列表框中选择角色时,10x50网格被填充,甚至填充也需要几秒钟

在此处找到DataGrid2D示例:。我使用了Meleak的答案(第二个倒数),将m_intArray更改为一个2D数组,该数组由每个属性(c.stats)创建

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>