内容绑定仅适用于整数和字符串

时间:2015-06-13 05:27:27

标签: c# wpf xaml

我是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无法绑定。

2 个答案:

答案 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时起作用。

当应用这两个更改时,一切都按预期工作。