次のコードは、バインディングを設定するとともに、必要に応じてサイズを変更したいコントロールを含むグリッドを構築する方法を示しています。
public void BuildListTemplate(IEnumerable<Class1> myData, int numLabelCols)
{
var myGrid = new Grid();
for (int i = 0; i < myData.Count(); i++)
{
myGrid.RowDefinitions.Add(new RowDefinition() { Height= new GridLength(0, GridUnitType.Auto)});
}
for (int i = 0; i < numLabelCols; i++)
{
myGrid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(0, GridUnitType.Auto) });
}
myGrid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star) });
for (int i = 0; i < myData.Count(); i++)
{
for (int j = 0; j < numLabelCols; j++)
{
var tb = new TextBlock();
tb.SetBinding(TextBlock.TextProperty, new Binding("[" + i + "].labels[" + j + "]"));
tb.SetValue(Grid.RowProperty, i);
tb.SetValue(Grid.ColumnProperty, j);
tb.Margin = new Thickness(0, 0, 20, 0);
myGrid.Children.Add(tb);
}
var edit = new TextBox();
edit.SetBinding(TextBox.TextProperty, new Binding("[" + i + "].MyEditString"));
edit.SetValue(Grid.RowProperty, i);
edit.SetValue(Grid.ColumnProperty, numLabelCols);
edit.AcceptsReturn = true;
edit.TextWrapping = TextWrapping.Wrap;
edit.Margin = new Thickness(0, 0, 20, 6);
myGrid.Children.Add(edit);
}
contentPresenter1.Content = myGrid;
}
上記の簡単な説明グリッドを作成し、グリッドの行を定義するだけです。コンテンツのサイズを自動調整するグリッドの一連の列。
次に、データ ポイントごとにコントロールを生成し、バインディング パスを設定し、その他のさまざまな表示属性を割り当て、コントロールの正しい行/列を設定します。
最後に、表示するためにウィンドウ xaml で定義された contentPresenter にグリッドを配置します。
あとは、次のプロパティを持つクラスを作成し、contentPresenter1 のデータ コンテキストをそのオブジェクトのリストに設定するだけです。
public class Class1
{
public string[] labels { get; set; }
public string MyEditString { get; set; }
}
完全を期すために、ウィンドウの xaml とコンストラクターを示して、すべてを接続します。
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<ContentPresenter Name="contentPresenter1"></ContentPresenter>
</Window>
public MainWindow()
{
InitializeComponent();
var data = new List<Class1>();
data.Add(new Class1() { labels = new string[] {"the first", "the second", "the third"}, MyEditString = "starting text"});
data.Add(new Class1() { labels = new string[] { "col a", "col b" }, MyEditString = "<Nothing>" });
BuildListTemplate(data, 3);
DataContext = data;
}
もちろん、リストビューなどの他の方法を使用して、グリッドビューを構築することもできます (多数の行がある場合はこれを行います)、または他のそのようなコントロールを使用できますが、特定のレイアウト要件を考えると、おそらく必要になるでしょう。グリッドを使用したこのメソッド。
EDIT : xaml で実行する方法を探していることがわかりました。別々の行で動的にサイズ設定されたコンテンツに合わせて物事を揃える必要がない場合は、より実行可能になります...しかし、コードビハインドを恐れないでください。UIを作成するときにそれが必要です。