将列表集合绑定到列表视图

时间:2014-11-30 09:23:41

标签: c# xaml windows-phone-8.1

我有一个对象列表,我想使用数据模板将它们绑定到列表视图(单向绑定)。目前,列表视图没有显示任何内容,我是新手,我不知道问题出在哪里。

这是我的对象类

public class CategoryObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public string CategoryObjectInstance;

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var eventHandler = this.PropertyChanged;
        if (eventHandler != null)
        {
            eventHandler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

这是列表视图的XAML代码

<ListView Grid.Row="2" Name="ListView1" Margin="10,0">
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock 
                    Style="{StaticResource ListViewItemContentTextBlockStyle}"
                    Text="{Binding Path=CategoryObject.CategoryObjectInstance, Mode=OneWay}" />
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

这是我输入itemssource的代码

protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        List<CategoryClass.CategoryObject> newCategoryObjectList = new List<CategoryClass.CategoryObject>();
        for (int i = 0; i < 10; i++)
        {
            CategoryClass.CategoryObject newCategoryObject = new CategoryClass.CategoryObject();
            //set arbitarily value 
            newCategoryObject.CategoryObjectInstance = i.ToString() + i.ToString() + i.ToString() + i.ToString() + i.ToString();
            newCategoryObjectList.Add(newCategoryObject);
        }

        //to debug
        var messageDialog = new Windows.UI.Popups.MessageDialog(newCategoryObjectList.Count.ToString());
            messageDialog.ShowAsync();

        ListView1.ItemsSource = newCategoryObjectList;
    }

我在这里做错了什么?此外,如何/可以使用数据上下文来实现这一目标?非常感谢!

2 个答案:

答案 0 :(得分:0)

DataContext已设置为列表中的对象。试试这个:

Text="{Binding CategoryObjectInstance, Mode=OneWay}" />

答案 1 :(得分:0)

这里有几个问题:

  • 第一个主要问题是你在XAML中绑定的路径错误,应该是:

    <TextBlock Text="{Binding Path=CategoryObjectInstance, Mode=OneWay}" />
    
  • 第二个主要问题是你应该绑定到属性 - 没有它也不会起作用

  • 并且您正在定义OnPropertyCanged,但您没有使用它(现在这不是那么重要,但进一步的更改不会在列表中显示)。考虑到这一点及以上,它应该是这样的:

    public string categoryObjectInstance;
    public string CategoryObjectInstance
    {
        get { return categoryObjectInstance; }
        set { categoryObjectInstance = value; OnPropertyChanged("CategoryObjectInstance"); }
    }
    
  • 但上面的内容只会在“CategoryObjectInstance”发生变化时有所帮助,以后在添加/删除项目时无法帮助您,我建议使用 ObservableCollection 而不是列表

另外我看到您使用 MessageBox 进行调试但不适合这个,尝试使用:

//to debug
Debug.WriteLine(newCategoryObjectList.Count);

在Visual Studio中打开 Debug-&gt;输出窗口 - 您将在那里看到它。如果您以前使用它,您可能已经看到了以前的问题。