0

我在 MSDN 上探索DataTemplate并找到了样式和模板。它说 -

"在这个示例应用程序中,有一个绑定到照片列表的 ListBox 控件:

<ListBox ItemsSource="{Binding Source={StaticResource MyPhotos}}"
     Background="Silver" Width="600" Margin="10" SelectedIndex="0"/>  

此 ListBox 当前如下所示: "

在此处输入图像描述

//...一些关于DataTemplate...的东西//

在我们的示例应用程序中,每个自定义Photo对象都有一个Source字符串类型的属性,用于指定图像的文件路径。目前,照片对象显示为文件路径。"

"要使照片显示为图像,您可以创建一个 DataTemplate 作为资源: "

<Window.Resources>
...
<!--DataTemplate to display Photos as images
    instead of text strings of Paths-->
<DataTemplate DataType="{x:Type local:Photo}">
  <Border Margin="3">
    <Image Source="{Binding Source}"/>
  </Border>
</DataTemplate>
...
</Window.Resources>  

好的,很公平,所以我声明了 Photo 类 -

public class Photo
{
    public string Source { get; set; }
} 

我的 XAML 感觉不是很好(实际上很糟糕)。我在这里没有得到的是ListBox 的ItemsSource的设置方式。就我的 XAML 而言,这里的“MyPhotos”必须是Photo 类型 x:KeyIEnumerable对象,例如 -

<Window.Resources>
...
<local:PhotoList x:Key="MyPhotos"/>
...
</Window.Resources>  

但我不知道在这种情况下PhotoList类应该是什么样子。那么,导致 ListBox 填充照片字符串的 Resource实际上是什么样子的呢?Source

仅供参考:以我自己的方式实现事物,我的DataTemplate探索取得了成功,虽然这不是我最关心的事情,但我只想知道我不知道的事情。任何人都可以解释一下吗?

编辑以回应 H.B.提供的答案。

问题的重点是在应用 DataTemplate 之前获得结果,如图所示,并了解实现这一目标的资源。

如果我将其PhotoList本身设为 IEnumerable,例如 -

public class PhotoList : List<Photo>
{
    //some property to hold the collection of Photo objects??
}

并在资源中实例化它,然后实际绑定什么?ItemsSource它将如何运作?对不起,我不明白。我希望你能详细说明这一点。

所以,我DataSourceProvider选择了。但由于该Data属性没有设置器,我尝试了以下 -

public class Photo
{
    public string Source { get; set; }
}

public class PhotoList : DataSourceProvider
{
    private List<Photo> _photos;

    public PhotoList()
    {
        _photos = new List<Photo>
                      {
                          new Photo{ Source = @"D:\AppImage\1.jpg"},
                          new Photo{ Source = @"D:\AppImage\2.jpg"},
                          new Photo{ Source = @"D:\AppImage\3.jpg"},
                          new Photo{ Source = @"D:\AppImage\4.jpg"},
                          new Photo{ Source = @"D:\AppImage\5.jpg"},
                      };
        ((List<Photo>)this.Data).AddRange(_photos);
    }
}  

而且我肯定做错了什么。因为,现在我在资源中实例化时收到无法创建“PhotoList”实例错误消息PhotoList-

<Window.Resources>
    <local:PhotoList x:Key="MyPhotos"/>
</Window.Resources>  

请帮帮我。

4

2 回答 2

1

PhotoList本身要么必须是一个IEnumerable对象Photo,要么它需要提供一个,这可以通过继承DataSourceProvider和公开列表来完成。


编辑: 显然,如果你只是从无中继承,List<T>除非你添加项目,否则当我说它应该是一个IEnumerable我的意思时,我的意思是一个直接的实现,它实际上立即枚举字符串。如果您只想在 XAML 中创建一个列表,您不妨使用x:Array.

这里还有一个使用的例子DataSourceProvider

public class PhotoList : DataSourceProvider
{
    protected override void BeginQuery()
    {
        var files = Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures))
                        .Where(f => Path.GetExtension(f) == ".png")
        OnQueryFinished(files);
    }
}

这将使用个人“图片”文件夹中的 PNG 文件的路径填充您的列表。

DataTemplate此外,如果您使用类似的类,您将不会获得示例的-less 外观,Photo除非您覆盖ToString以返回源 URL,因为默认情况下,如果没有DataTemplate,它只会显示类的全名。


在任何情况下,您都需要Photo集合中的对象DataTemplate才能正确应用。此外,您通常没有直接在 XAML 中的集合,而是一些数据对象,DataContextWindow/ UserControl

于 2012-09-10T22:40:41.537 回答
0
 <Window.Resources>
    <ph:PhotoList x:Key="MyPhotos"  Path="D:\Visual Studio Projects\WPF APPLICATIONS\ImageViewer\ImageViewer\Images">      
    </ph:PhotoList>    
 </Window.Resources>
于 2012-09-10T17:25:01.457 回答