0

MSDNでStyling and Templating を調べ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自体がIEnumerableofPhotoオブジェクトである必要があるか、オブジェクトを提供する必要があります。これは、そのようにリストを継承し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 ファイルのパスがリストに入力されます。

また、ソース URL を返すようにオーバーライドしない限り、次DataTemplateのようなクラスを使用する場合、例の -less の外観は得られません。PhotoToStringDataTemplate


いずれにせよ、を適切に適用する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 に答える