1

実行時まで生成されないグリッドにUIElementsを挿入する必要があります。具体的には、表示する必要のある要素の数を決定した後、作成するRowDefinitionsにUIElementsを追加する必要があります。C#のオブジェクトのXAMLのようにGrid.RowとGrid.ColumnとGrid.RowSpanを制御する方法はありますか?私がこれを間違えている場合は、私に知らせてください。StackPanelを使用できません(動的なアコーディオンパネルを作成していますが、アニメーションが混乱しています)。

今何が起こっているのかというと、実行時にRowDefinitionsの数を生成し、子としてUIElementsを追加します。これは機能していません。すべてのUIElementは、最初の行が互いに重なり合って表示されます。

これが私が試していることの例です:

public partial class Page : UserControl
{
    string[] _names = new string[] { "one", "two", "three" };
    public Page()
    {
        InitializeComponent();
        BuildGrid();
    }
    public void BuildGrid()
    {
        LayoutRoot.ShowGridLines = true;
        foreach (string s in _names)
        {
            LayoutRoot.RowDefinitions.Add(new RowDefinition());
            LayoutRoot.Children.Add(new Button());
        }
    }
}

ありがとう!

4

3 に答える 3

2

探していることを実行する最善の方法は、以下のパターンに従うことです。

Page.xaml:

<UserControl x:Class="SilverlightApplication1.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
    Width="400" Height="300">
    <Grid x:Name="LayoutRoot" Background="White">
        <data:DataGrid x:Name="DataGridTest" />
    </Grid>
</UserControl>

Page.xaml.cs:

public partial class Page : UserControl
    {
        string[] _names = new string[] { "one", "two", "three" };

        public Page()
        {
            InitializeComponent();
            BuildGrid();
        }

        public void BuildGrid()
        {
            DataGridTest.ItemsSource = _names;
        }
    }

これにより、文字列配列の内容から行が動的に構築されます。将来的には、T がINotifyPropertyChangedを実装するObservableCollectionを使用するのがさらに良い方法です。これにより、コレクションからアイテムを削除または追加した場合、および T のプロパティが変更された場合に、その行を更新するように DataGrid に通知されます。

表示に使用される UIElements をさらにカスタマイズするには、DataGridTemplateColumnを使用できます。

<data:DataGridTemplateColumn Header="Symbol">
    <data:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding PutNameOfPropertyHere}" />
        </DataTemplate>
    </data:DataGridTemplateColumn.CellTemplate>
</data:DataGridTemplateColumn>
于 2009-02-11T23:28:37.807 に答える