Это довольно легко сделать с ItemsControl
.Если ваша ViewModel предоставляет список объектов метаданных, скажем, такой класс:
public class FileMetaData : INotifyPropertyChanged
{
private string name;
private string value;
public event PropertyChangedEventHandler PropertyChanged = (o, e) => { };
public string Name
{
get { return name; }
set
{
name = value;
PropertyChanged(this, new PropertyChangedEventArgs("Name"));
}
}
public string Value
{
get { return value; }
set
{
this.value = value;
PropertyChanged(this, new PropertyChangedEventArgs("Value"));
}
}
}
Затем ваша ViewModel представит его как ObservableCollection
(поэтому WPF знает, когда новые элементы добавляются или удаляются):
public class MyViewModel
{
...
public ObservableCollection<FileMetaData> Files { get; private set; }
...
}
Тогда ваше представление будет использовать ItemsControl
с ItemTemplate
для его отображения:
<ItemsControl ItemsSource="{Binding Files}" Grid.IsSharedSizeScope="True">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="one" />
<ColumnDefinition Width="Auto" SharedSizeGroup="two" />
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Name}" />
<TextBox Grid.Column="1" Text="{Binding Value}" />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Обратите внимание, что я устанавливаю Grid.IsSharedSizeScope
в true наItemsControl
, поэтому столбцы будут выровнены.Если у вас много данных, вы, вероятно, захотите обернуть их в ScrollViewer
(или лучше пересмотреть ItemsControl
, чтобы получить их).