您已经提出了很多要求,以下代码显示了如何使用所需大小的控件构建网格,以及设置绑定:
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;
}
您当然可以使用其他方法,例如列表视图并为其构建网格视图(如果您有大量行,我会这样做)或其他一些此类控件,但考虑到您的特定布局要求,您可能会想要这个方法用网格。
编辑:刚刚发现您正在寻找一种在 xaml 中做事的方式 - 我只能说我不认为您想要的功能太可行。如果您不需要将内容与单独的行上的动态大小的内容对齐,那将更可行......但我还要说,不要害怕后面的代码,它在创建 ui 时就有它的位置。