2016-08-23 2 views
2

사용자 지정 컨트롤을 만들고 있습니다.종속성 속성을 사용하여 이미지 소스 바인딩

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"

DependencyProperty 다음 내 C# 파일에서
<Image Source="{TemplateBinding Poster}" /> 

입니다 :이 사용자 지정 컨트롤이 같은 그것의 이미지가 코드에서 Poster = new BitmapImage(new Uri(@"pack://application:,,,/Images/NoPoster.png"))

모든 것이 잘 작동합니다. 내가 궁금해하는 이유는 ImageSource 대신 PosterBitmapImage 또는 string으로 선언 할 수 없다는 것입니다.

답변

3

물론 BitmapImage으로 지정할 수 있습니다. 하지만 기본 클래스 ImageSource이면 충분하므로 불필요한 제한이됩니다. 소스와 더 이상 속성 유형을 대상으로하지 일치하고, 내장 된 자동 형 변환이 이루어져야하기 때문에

, 당신은 또한 속성 유형으로 string 또는 Uri을 사용할 수 있지만, 당신은 정기적으로 바인딩하여 TemplateBinding을 교체해야합니다 :

타입 변환이 ImageSource에 대한 형식 변환기로 등록 된 ImageSourceConverter 클래스에 의해 자동으로 수행하기 때문에 당신이 명시 적으로 바인딩 컨버터를 필요가 없습니다
<Image Source="{Binding Poster, RelativeSource={RelativeSource TemplatedParent}}" /> 

참고.

+0

답변 해 주셔서 감사합니다. 귀하의 모범은 실제로 작동하고 내가 처음에 무엇을했는지. 나는 문자열을 'Uri'로 먼저 변환 한 다음 'BitmapImage'로 변환하는 것보다 작다고 생각합니다. 무엇을 제안하겠습니까? 더 많이 사용되는 방법입니까? – Krowi

+0

'string'은 물론 충분합니다. 그러나 Uri 클래스가 수행하는 유효성 검사를 활용하고 싶을 수도 있습니다. 컨트롤 사용자가 잘못된 URI를 전달하려고하면 예외가 발생합니다. 가지고있을 나쁜 것이 아닙니다. – Clemens

+0

나는 이것이 약간의 화제를 얻기 시작하고있다는 것을 알고있다. 그러나 '우리'의 유효성 검사는 무엇을 의미 하는가? – Krowi