ListView项目不显示

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ListView项目不显示相关的知识,希望对你有一定的参考价值。

我有一个相当简单的ListViewGridView风格。细胞被绑定到ObservableCollection元素的某些属性。我不知道为什么没有显示。我正在考虑在集合包含的元素类中实现INotifyPropertyChanged,但是一旦元素被构造并添加到集合中,它就永远不会被改变,所以它应该工作得很好。

C#:

public ObservableCollection<SceneElement> SceneObjects { get; set; }
...
SceneObjects.Add(new Camera());
SceneObjects.Add(new Cuboid(20, 30, 40));

CameraCuboid都继承自SceneObjectSceneObject Figure CuboidSceneObject 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类中定义。 PositionXYZ也是物业。

编辑

这解决了这个问题:

private ObservableCollection<SceneElement> sceneObjects;
    public ObservableCollection<SceneElement> SceneObjects
    {
        get
        {
            return sceneObjects;
        }
        set
        {
            sceneObjects = value;
            NotifyPropertyChanged("SceneObjects");
        }
    }

谁能解释为什么这是必要的?到目前为止,我已经使用了几次qazxsw poi,它总是在没有通知的情况下工作。

答案

您的应用程序未显示有关集合的信息的原因是UI未发现任何更改。 如果在使用之前未初始化所述集合,则使用ObservableCollection不保证将显示结果。因为它是ViewModel上的普通属性,所以它需要通知所述对象,在这种情况下ObservableCollection已被更改,但不是在集合内部的意义项中。 这是因为没有为ObservableCollection提升PropertyChanged事件,这对使用SceneObjectsWPF应用程序至关重要。

另一答案

在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不工作?

ListView 未显示在片段中

片段中 ListView 的 setOnItemClickListener

从片段中ListView的onItemClick开始Activity

当 listview 行项目中包含隐藏视图时,片段不尊重匹配父高度

ArrayAdapter 要求资源 ID 为 TextView,ListView 无法转换为 TextView