2016-08-23 8 views
2

私はカスタムコントロールを作成しています。 、私のC#ファイルで依存性プロパティを使用したイメージソースのバインド

<Image Source="{TemplateBinding Poster}" /> 

DependencyPropertyは次のとおりです:このカスタムコントロールはこのようにそれにイメージを持ってい

public static readonly DependencyProperty PosterProperty = DependencyProperty.Register(
    nameof(Poster), 
    typeof(ImageSource), 
    typeof(MovieButton), 
    new UIPropertyMetadata(null)); 

public ImageSource Poster 
{ 
    get { return (ImageSource)GetValue(PosterProperty); } 
    set { SetValue(PosterProperty, value); } 
} 

今、私はXAMLで私のユーザーコントロールに次を追加することができます。Poster="Images/NoPoster.png"コードのPoster = new BitmapImage(new Uri(@"pack://application:,,,/Images/NoPoster.png"))

すべて正常です。私が疑問に思うのは、ImageSourceの代わりにPosterBitmapImageまたはstringと宣言できないのはなぜですか?

答えて

3

もちろん、BitmapImageと宣言できます。しかし、基本クラスImageSourceで十分であるため、これは不要な制限です。ソースともはやプロパティタイプをターゲットにしないと一致し、内蔵の自動型変換が行われる必要があるため

、あなたはまた、プロパティのタイプとしてstringまたはUriを使用することができますが、その後は定期的に結合することによって、TemplateBindingのを置き換える必要があります。

<Image Source="{Binding Poster, RelativeSource={RelativeSource TemplatedParent}}" /> 

ImageSourceの型変換器として登録されたImageSourceConverterクラスによって型変換が自動的に実行されるため、明示的なバインディングコンバータは必要ありません。

+0

ありがとうございました。あなたの例は確かに働いていて、私が最初に何をしていたのか。文字列を設定することは、最初に 'Uri'に変換してから' BitmapImage'に変換するよりも簡単です。あなたは何をお勧めしますか? – Krowi

+0

'string'はもちろん十分です。しかし、 'Uri'クラスによって行われた妥当性検査を利用したいかもしれません。コントロールのユーザーは、無効なURIを渡そうとすると例外が発生します。持つべき悪いことではありません。 – Clemens

+0

これは少し話題になり始めていることは分かっていますが、 'Uri'の有効性チェックではどういう意味ですか? – Krowi

関連する問題