我是XAML的新手,必须参与现有的大学项目。不幸的是,我很困惑如何处理内容绑定。 我有以下XAML代码(代码段):
<!-- SnapshotsV.xaml -->
<s:ScatterView Grid.Row="1" Grid.Column="1" Grid.RowSpan="2" Panel.ZIndex="2" Name="SnapshotsScatterView" ItemsSource="{Binding Path=SnapshotsCollection}" AllowDrop="False" Background="#FF151515" Width="{Binding ScrollContainerWidth}">
<s:ScatterView.ItemContainerStyle>
<Style TargetType="s:ScatterViewItem">
<Setter Property="Height" Value="300"/>
<Setter Property="Width" Value="300"/>
<Setter Property="Orientation" Value="0"/>
<Setter Property="CanScale" Value="False"/>
<Setter Property="CanMove" Value="True" />
<Setter Property="CanRotate" Value="False" />
<Setter Property="Center" Value="{Binding Path=ItemPosition}" />
</Style>
</s:ScatterView.ItemContainerStyle>
<s:ScatterView.ItemTemplate>
<DataTemplate>
<Grid>
<Label Content="{Binding Path=ID}" />
<Image Source="{Binding Path=SnapshotImage}" />
</Grid>
</DataTemplate>
</s:ScatterView.ItemTemplate>
</s:ScatterView>
以下View-Model属于此视图(代码段):
// SnapshotsVm.cs
public class SnapshotsVm : ViewModelBase
{
[...]
public ObservableCollection<SnapshotItem> SnapshotsCollection
{
get { return SnapshotMaker.SnapshotItemCollection; }
}
}
SnapshotsItemCollection是一个包含一个或多个SnapshotItem-Classes的List。它实现为ObservableCollection<SnapshotItem>
。 SnapshotItem-Class如下所示:
public class SnapshotItem : ViewModelBase
{
private int _Id;
private Image _Image;
private String _XMLString;
private Point _position;
public int ID
{
get { return _Id; }
}
public String Test { get { return "abc"; } }
public Image SnapshotImage
{
get { return _Image; }
}
public String XMLString
{
get { return _XMLString; }
}
public Point ItemPosition
{
get { return _position; }
}
public SnapshotItem(int id, String SnapshotDirectory)
{
this._Id = id;
this._Image = Image.FromFile(SnapshotDirectory + @"\snapshot-" + id + @".png");
this._XMLString = null; //TODO later
this._position = new Point(id*400+200, 200);
}
}
到目前为止一切顺利。
我不明白的事实是,内容绑定仅适用于某些数据类型。正如您在SnapshotItem类中看到的那样,有一个名为ID的Integer和一个名为Test的String。当我通过{Binding Path = ID}或{Binding Path = Test}绑定它们时,它们在XAML中工作正常。其他数据属性(如SnapshotImage或ItemPosition)无效。
我通过断点检查了SnapshotItem类中的变量。它们在构造函数中成功并正确设置。但我不明白为什么我不能将它们用于我的内容绑定。
此外,我注意到,当我在SnapshotsVm.cs文件中直接创建SnapshotItem时,它可以正常工作。我在那里创建了一个类似的类,用随机数据填充它,它工作正常。但出于代码逻辑的原因,我想在静态SnapshotMaker类中创建SnapshotItems。元素的创建工作正常,我可以在GUI中看到它们。但是ItemPosition和SnapshotImage无法绑定。
答案 0 :(得分:0)
第一次设置ScatterView
时,ItemsSource="{Binding Path=SnapshotsCollection}"
(即SnapshotsCollection
)的绑定就会发生。因此,您需要在创建收藏集时初始化所有数据(例如位置,图片等)。它应该是这样的:
SnapshotsCollection = new ObservableCollection<SnapshotItem>();
int Id = 1;
var point = new Point(800,200);
var image = Image.FromFile(SnapshotDirectory + @"\snapshot-" + id + @".png");
SnapshotsCollection.Add(SnapshotMaker.Create(1, point, image));
答案 1 :(得分:0)
好的,我自己找到了解决方案。我犯了几个错误。
Image Source = {Binding Path = SnapshotImage}采用图像所在的字符串。以这种方式不可能将图像作为自身传递。我应该更仔细地阅读文档。
更棘手的方法是不工作的Point。我没有意识到我使用了导入System.Drawing.Point中的Point。它在我使用System.Windows.Point时起作用。
当应用这两个更改时,一切都按预期工作。