以MVVM模式动态生成网格

时间:2010-09-17 16:54:29

标签: wpf

我正在编写一个WPF应用程序,我需要显示自定义文件iformation,其中包含字段名称&它的价值。我用标签&生成了一个网格朗姆酒。文本框。我在标签&中显示字段名称文本框中的字段值(我希望它是可编辑的)。 &安培;每次文件选择改变时,字段改变的数量和所以网格列&行。现在我在代码后面生成这个网格。有没有办法可以在XAml中使用视图模型。

2 个答案:

答案 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来创建一个显示一些细节的选中列表框,但你也应该能够找到其他好的例子。