ListView项目不显示
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ListView项目不显示相关的知识,希望对你有一定的参考价值。
我有一个相当简单的ListView
与GridView
风格。细胞被绑定到ObservableCollection
元素的某些属性。我不知道为什么没有显示。我正在考虑在集合包含的元素类中实现INotifyPropertyChanged
,但是一旦元素被构造并添加到集合中,它就永远不会被改变,所以它应该工作得很好。
C#:
public ObservableCollection<SceneElement> SceneObjects { get; set; }
...
SceneObjects.Add(new Camera());
SceneObjects.Add(new Cuboid(20, 30, 40));
Camera
和Cuboid
都继承自SceneObject
(SceneObject
Figure
Cuboid
和SceneObject
Camera
)
XAML:
<ListView Grid.Column="2" Margin="5"
ItemsSource="{Binding }"
DataContext="{Binding SceneObjects}"
ScrollViewer.CanContentScroll="True">
<ListView.Resources>
<GridView x:Key="StyleOne">
<GridViewColumn Header="Type" >
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="1" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Position" >
<GridViewColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="X: " />
<TextBlock Text="{Binding Position.X, RelativeSource={RelativeSource Mode=FindAncestor}}" />
<TextBlock Text=" Y: " />
<TextBlock Text="{Binding Position.Y}" />
<TextBlock Text=" Z: " />
<TextBlock Text="{Binding Position.Z}" />
</StackPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.Resources>
<ListView.Style>
<Style TargetType="ListView">
<Setter Property="View" Value="{StaticResource StyleOne}" />
</Style>
</ListView.Style>
</ListView>
Position
属性在抽象的SceneElement
类中定义。 Position
的X
,Y
和Z
也是物业。
编辑
这解决了这个问题:
private ObservableCollection<SceneElement> sceneObjects;
public ObservableCollection<SceneElement> SceneObjects
{
get
{
return sceneObjects;
}
set
{
sceneObjects = value;
NotifyPropertyChanged("SceneObjects");
}
}
谁能解释为什么这是必要的?到目前为止,我已经使用了几次qazxsw poi,它总是在没有通知的情况下工作。
您的应用程序未显示有关集合的信息的原因是UI未发现任何更改。
如果在使用之前未初始化所述集合,则使用ObservableCollection
不保证将显示结果。因为它是ViewModel上的普通属性,所以它需要通知所述对象,在这种情况下ObservableCollection
已被更改,但不是在集合内部的意义项中。
这是因为没有为ObservableCollection
提升PropertyChanged
事件,这对使用SceneObjects
的WPF
应用程序至关重要。
在wpf系统尝试创建绑定的点上,您的observablecollection为null,如上面的xamimax所述。
在构造函数中实例化您的observablecollection,稍后您可以添加项目并显示它们。
例如,以下工作是因为我首先实例化了observable集合,然后在5秒后添加了项目。
Bidning
这是一个不起作用的例子,因为我在wpf系统试图绑定它之后5秒实例化可观察集合:
public MainWindow()
{
InitializeComponent();
this.SceneObjects = new ObservableCollection<MyClass>();
Task.Delay(5000).ContinueWith((old) =>
{
this.Dispatcher.Invoke(() =>
{
this.sceneObjects.Add(new MyClass("name"));
this.sceneObjects.Add(new MyClass("name"));
});
});
this.DataContext = this;
}
正如你已经意识到的那样,你可以抛出propchanged使wpf系统显示那些项目,但我确实认为你应该简单地实例化observablecollection,以便你以后不需要抛出propchanged。
以上是关于ListView项目不显示的主要内容,如果未能解决你的问题,请参考以下文章
片段中 ListView 的 setOnItemClickListener
从片段中ListView的onItemClick开始Activity