0

Character オブジェクトがあり、その中に 10 個の配列があり、キャラクターの 10 個の統計情報 (敏捷性、強さなど - これはロール プレイング ゲーム用です) を表しています。配列は統計を追跡し、時間の経過とともに増加するため、どのレベルでどの統計が増加したかがわかります。配列は有限です。私はレベル 50 まで追跡します。そのため、可変数の行または列を追跡する機能は必要ありません。すべてが修正されました。

例 string[] Agility = new string[50];

この情報を DataGrid に表示し、各行の各セルを各統計配列の要素にバインドします。DataGrid2D という名前のライブラリを見つけて試してみましたが、最善を尽くしても動作させることができませんでした。DataGrid の値を変更しようとすると、次のエラーが表示されます: 双方向バインディングにはパスまたは XPath が必要です。ListBox から文字を選択すると、10x50 のグリッドが表示されましたが、表示されるまでに数秒かかりました。

DataGrid2D の例は次の場所にあります: How to populate a WPF grid based on a 2-dimensional array . 私は Meleak の回答 (2 番目のもの) を使用し、m_intArray を各統計 (c.Stats) から作成された 2D 配列に変更しました。

var c = CE_Characters_charactersLB.SelectedItem as Character;
var dg = CE_Characters_statsDG;
dg.ItemsSource = GetBindable2DArray<string>(c.Stats);

より効率的なソリューションはありますか?または、DataGrid2D で Path エラーが発生する理由を知っている人はいますか?

4

3 に答える 3

0

同様の質問がありました。私のスレッドを見てください: 2次元データマトリックスへの双方向EntityCollectionバインディング

固定金額があり、双方向バインディングが必要だったという点で、列と行の固定金額を定義し、ItemsControl内のTextBlockにColumnとRowプロパティを動的に割り当てました。

ここにコードがあります

<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>

そのちょっと「汚いコード」ですが、この問題のために私は他の解決策を見つけられませんでした:)

于 2012-12-14T13:06:20.460 に答える
0

プログラムが機能しない理由を理解するのに、恥ずかしいほど長い時間がかかりました。

基本的に、私が正しければ、キャラクタークラスは次のようになります。

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; }
}

Datagridがこれらの統計プロパティを互いに分離しているために機能しない理由。いくつかの異なるプロパティに基づいて行を作成する方法がわかりません。

Nathan Cooperが前に指摘したように、本当に必要なのは、これらの各プロパティをintとして格納できるStat(または同様のもの)と呼ばれる別のクラスです。次に、データグリッドをバインドするためにこれらのクラスのコレクションが必要です。

このように考えてください。現在、データは垂直方向に列にグループ化されています。データグリッドは、行にグループ化されるデータに使用されます。したがって、行を表すオブジェクトのコレクションが必要です。

時間をかけて、コンセプトが機能していることを示すサンプルアプリケーションを作成しました。

キャラクタークラスは次のようになります。

 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; }
    }
}

ここでは、ネイサンが話していたものと同様のStatクラスを作成したことがわかります。私が言ったように、このクラスはデータグリッドの「行」を格納するので、データグリッドが簡単に理解できる方法でデータをグループ化できます。

フォームのXAMLは次のようになります。

<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に表示する文字を選択するコンボボックスを作成しました。この文字の統計は、データグリッドの列にバインドされています。

最後に、ViewModelを示します(MVVMを使用しているかどうかはわかりませんが、そうする必要があります。とにかく、このコードは、ほとんど変更を加えることなく、コードビハインドに入れることができます)。

public class MainWindowViewModel:ViewModelBase
{
    private IList<Character> _characters;
    public IList<Character> Characters
    {
        get
        {
            return _characters;
        }
        set
        {
            _characters = value;
            RaisePropertyChanged(()=>Characters);
        }
    }

    private Character _character;
    public Character SelectedCharacter
    {
        get
        {
            return _character;
        }
        set
        {
            _character = value;
            RaisePropertyChanged(()=>SelectedCharacter);
        }
    }

    public MainWindowViewModel()
    {
        InitializeCharacters();
    }

    private void InitializeCharacters()
    {
        Characters = new List<Character>();
        SelectedCharacter = new Character();
        Characters.Add(new Character
        {
            Name = "Tank",
            Level = 3,
            Stats = new List<Character.Stat>()
            {
                new Character.Stat()
                {
                    Agility =       10,
                    Intelligence =  8, 
                    Strength =      14,
                    Stamina =       16
                },

                    new Character.Stat()
                {
                    Agility =      11,
                    Intelligence = 9, 
                    Strength =     16,
                    Stamina =      18
                },

                    new Character.Stat()
                {
                    Agility =       12,
                    Intelligence = 10, 
                    Strength =      17,
                    Stamina =       20
                }
            }



        });

        Characters.Add(new Character 
        { 
            Name = "Healer", 
            Level = 4, 

              Stats = new List<Character.Stat>()
            {
                new Character.Stat()
                {
                    Agility =       10,
                    Intelligence =  14,
                    Strength =       8,
                    Stamina =       10
                },

                    new Character.Stat()
                {
                    Agility =      11,
                    Intelligence = 16,
                    Strength =     9, 
                    Stamina =      11
                },

                    new Character.Stat()
                {
                    Agility =      12,
                    Intelligence = 17,
                    Strength =    10, 
                    Stamina =      13
                },
                    new Character.Stat()
                {
                    Agility =       14,
                    Intelligence =  20,
                    Strength =     10, 
                    Stamina =       14
                }
            }
        });

        Characters.Add(new Character 
        { 
            Name = "Ranger", 
            Level = 6,  

            Stats = new List<Character.Stat>()
            {
                new Character.Stat()
                {
                    Agility =        12,
                    Intelligence =   8, 
                    Strength =       10,
                    Stamina =        8
                },

                    new Character.Stat()
                {
                    Agility =      14,
                    Intelligence = 9,
                    Strength =     11,
                    Stamina =     10
                },

                    new Character.Stat()
                {
                    Agility =       17,
                    Intelligence = 10, 
                    Strength =     12,
                    Stamina =      11
                },
                    new Character.Stat()
                {
                    Agility =      18,
                    Intelligence =11,
                    Strength =    13,
                    Stamina =     12
                },

                    new Character.Stat()
                {
                    Agility =       20,
                    Intelligence = 12,
                    Strength =     15,
                    Stamina =      13
                },
                    new Character.Stat()
                {
                    Agility =      22,
                    Intelligence = 13,
                    Strength =     16,
                    Stamina =      13
                }
            }
        });

    }


}

ViewModelのスペースのほとんどは、ダミーデータを作成するために私が使用しているので、必要に応じて削除してください。重要な部分は、SelectedCharacterクラスとCharactersクラスの作成です。

これがプロジェクトへのリンクで、実際の動作を確認できます。(名前が苦手な名前を失礼します) https://docs.google.com/open?id=0B9JOiSJxT9vjZVl1SHd3UzBiZEE

幸運を

U_U

于 2012-12-14T14:12:30.013 に答える
0

あなたが投稿したリンクから:「DataGridをサブクラス化し、2Dまたは1Dソース​​に対するバインディングに使用されるItemsSource2Dというプロパティを追加します」

したがって、そのライブラリで提供される DataGrid を使用し、ItemsSource2D プロパティを使用する必要があると思います

于 2012-12-14T11:10:06.193 に答える