以编程方式将项添加到gridview / listview

时间:2014-10-26 12:50:48

标签: c# listview gridview windows-phone-8

我的GridView有这个模板:

  <DataTemplate x:Key="GroupTemplate1">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>

            <Border Background="{ThemeResource ListViewItemPlaceholderBackgroundThemeBrush}" Margin="0,9.5,0,0">
                <Image Source="{Binding Property3}" Height="79" Width="79"/>
            </Border>

            <!-- <StackPanel Grid.Column="1" Margin="14.5,0,0,0">
                <TextBlock Text="{Binding Property1}" Style="{ThemeResource ListViewItemTextBlockStyle}"/>
                <TextBlock Text="{Binding Property2}" Style="{ThemeResource ListViewItemSubheaderTextBlockStyle}"/>
            </StackPanel> -->

        </Grid>
    </DataTemplate>

如您所见,每个项目有三个信息:Property3(图像),Property2(文本),Property1(文本)。

如何使用这三个字段创建和添加新的ListViewItem并以编程方式将其添加到GridView?

类似的东西:

//
gridView1.Add(new ListViewItem("imagename", "text1", "text2");
//

1 个答案:

答案 0 :(得分:2)

您似乎正在尝试同时执行MVVM和非MVVM。使用预先制作的DataTemplate和绑定,你无法按照自己的方式做事。通常,您在XAML中预先构建ListView之间可以做出选择,在这种情况下,设计或多或少是静态的,或者将ListView绑定到集合并使用INotifyPropertyChanged让UI识别它需要更新视图。了解WPF的大部分功能来自于很少需要手动将项目添加到UI控件或根本不需要更改它们。

这是一个非常简单的实现:

这将是每个GridViewItem从中获取其信息的对象 - 其中Property1,Property2等将来自:

class ModelSample
{
    public object Property1 { get; set; } // anything you ever bind to *must* be a public property
    public object Property2 { get; set; }
    public object Property3 { get; set; }
}

以下是ViewModel示例的实现:

class ViewModelSample : INotifyPropertyChanged  // uses System.ComponentModel
{
    private List<ModelSample> models = new List<ModelSample>();
    public List<ModelSample> Models 
    { 
        get { return models; }
        set
        {
            models = value;
            NotifyPropertyChanged("Models");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }   
}

然后,您将实例化ViewModelSample并设置DataContext:

var viewModelSample = new ViewModelSample();
// add your objects to viewModelSample.Models
this.DataContext = viewModelSample.

将ListView上的ItemsSource属性绑定到Models。每当您想要更改ListView的图像时,只需修改模型的内容,UI应立即反映集合的当前状态。

这可能看起来比你习惯的要复杂一些,但是一旦你得到使用NotifyPropertyChanged来提醒用户界面的基本想法,你会发现它的工作量实际上要少得多,WPF几乎可以处理一切都适合你。