我正在编写一个WPF应用程序,我需要显示自定义文件iformation,其中包含字段名称&它的价值。我用标签&生成了一个网格朗姆酒。文本框。我在标签&中显示字段名称文本框中的字段值(我希望它是可编辑的)。 &安培;每次文件选择改变时,字段改变的数量和所以网格列&行。现在我在代码后面生成这个网格。有没有办法可以在XAml中使用视图模型。
答案 0 :(得分:3)
使用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
的{{1}}来显示它:
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
以获得一个数据。)
答案 1 :(得分:1)
我不确定你为什么要在运行时创建这个网格。您应该考虑使用标准的表示方法,例如<ListBox>
和自定义项模板。总是希望使用UI的声明定义(在XAML中)而不是代码隐藏。
我有一个blog post来创建一个显示一些细节的选中列表框,但你也应该能够找到其他好的例子。