【发布时间】:2018-06-10 18:35:09
【问题描述】:
我有一个相当简单的ListView 和GridView 风格。单元格绑定到 ObservableCollection 元素的某些属性。我不知道为什么 thaey 不显示。我正在考虑在集合包含的元素类中实现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");
}
}
谁能解释为什么这是必要的?到目前为止,我已经使用了ObservableCollection 严重的时间,它总是在没有通知的情况下工作。
【问题讨论】:
-
您将
ObservableCollection设置为DataContext?我会将包含 ObservableCollection 的 VM 设置为上下文,然后将ItemSource绑定到SceneObjects? -
在我看来,将
ItemSource绑定到SceneObjects和DataContext到VM 是一回事。当您将DataContext绑定到ObservableCollection,然后将ItemSource绑定到{Binding}时,它将绑定到此集合包含的元素。我过去做过,效果很好。 -
很好学的东西。谢谢
-
您仍然需要通知正在更改的属性。因此 PropertyChanged 事件。 Observable 集合将通知更改,但 UI 不知道最初为 null 的属性现在包含项目。跳这个有道理。
-
这听起来像是一种代码隐藏方法。你应该避开这一点。它会为您省去很多麻烦。