我有一个相当简单ListView
与GridView
风格。单元绑定到ObservableCollection
元素的某些属性。我不知道为什么塞伊不显示。我正在考虑INotifyPropertyChanged
在collection包含的元素类中实现,但是一旦构造了元素并将其添加到collection中,它就永远不会改变,因此它应该可以正常工作。
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");
}
}
谁能解释为什么这是必要的?ObservableCollection
到目前为止,我已经使用了严重的时间,并且总是在没有通知的情况下工作。
您的应用程序未显示有关集合的信息的原因是因为UI不知道任何更改。
如果ObservableCollection
不能保证在使用之前未初始化所述集合,则使用并不能保证会显示结果。由于它是ViewModel上的普通属性,因此需要通知是否ObservableCollection
已更改了该对象(在这种情况下),但从某种意义上来说,不是该集合中的项。
这是由于没有引发PropertyChanged
事件的事实SceneObjects
,这对于使用的WPF
应用程序至关重要Bidning
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句