2012-01-17 4 views
0

현재 WPF 이미지 컨트롤을 캡슐화하는 이미지 뷰어 컨트롤과 추가 기능 (필터 적용 및 뷰 변경 컨트롤)을 작성합니다. 사용자 정의 컨트롤의사용자 정의 유형 종속성 속성이있는 사용자 정의 컨트롤 (바운드)

public partial class ImageViewPort : UserControl, INotifyPropertyChanged 
{ 
    private BitmapSource _source; 

    public static readonly DependencyProperty ImageDescriptorSourceProperty = 
     DependencyProperty.Register("ImageDescriptorSource", 
           typeof(ImageDescriptor), 
           typeof(ImageViewPort), 
           new UIPropertyMetadata(ImageDescriptorSourceChanged)); 

    public ImageDescriptor ImageDescriptorSource 
    { 
     get { return (ImageDescriptor)GetValue(ImageDescriptorSourceProperty); } 
     set { SetValue(ImageDescriptorSourceProperty, value); } 
    } 

    public BitmapSource Source //the image control binds to this beauty! 
    { 
     get { return _source; } 
     set { _source = value; OnPropertyChanged("Source"); } 
    } 

    public ImageViewPort() { InitializeComponent(); } 

    private static void ImageDescriptorSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     ImageViewPort viewPort = (ImageViewPort)d; 
     if (viewPort != null) 
     { 
      viewPort.TransformImage(); 
     } 
    } 

    private BitmapSource TransformImage() 
    { 
     //do something that sets the "Source" property to a BitmapSource 
    } 
} 

XAML 코드 (에만 관련 부품) :

<UserControl x:Name="viewPort"> 
<Image Source="{Binding ElementName=viewPort,Path=Source}"/> 
</UserControl> 

그리고 마지막으로 사용 : 여기에 컨트롤의 소스 코드의 관련 부분의에서

<WPF:ImageViewPort ImageDescriptorSource="{Binding Path=CurrentImage}"/> 

내 기본적으로 Collection을 반복하고 CurrentImage 속성에 대한 PropertyChanged 알림을 throw합니다. 작동하면 매번 getter가 호출되므로 바인딩이 작동하는 것 같습니다.

내가 지금 일어날 것으로 예상되는 것은 내 UserControl의 PropertyChanged-Callback이 해고되었지만 그런 일이 발생하지 않는다는 것입니다 (중단 점이 없으며 중단 점을 사용하여 시도했습니다). 기본 유형 (int)을 바인딩하는 것과 같은 것을 시도해 보았습니다.

구현에 결함이 있습니까? 사용자 컨트롤이 업데이트되지 않는 이유는 무엇입니까? 미리 도움 주셔서 감사드립니다.

건배

SEBI

+0

출력 확인 ... 바인딩 경고가 나타 납니까? 또한 새로운 가치를 설정하고 있습니까? WPF는 이미 설정된 값을 설정하려고 시도 할 때이를 알고 무시합니다. FrameworkPropertyMetadata에 메타 데이터 유형을 지정하고 적절한 기본값을 제공하는 것이 좋습니다. – dowhilefor

+0

이'{Binding ElementName = viewPort, Path = Source}' 은'viewPort' 엘리먼트에'Source'가 있음을 암시합니다. 실제로 보이지 않는 DP는 실제로 사용하고있는 XAMl입니까? –

+0

@dowhilefor : 내 콘솔 창에서 데이터 바인딩 예외에 대해 잊어 버리는 것은 어리석은 짓입니다. 감사합니다! –

답변

1

출력을 확인 ... 당신이 어떤 바인딩 경고를받을 수 있나요? 또한 새로운 가치를 설정하고 있습니까? WPF는 이미 설정된 값을 설정하려고 시도 할 때이를 알고 무시합니다. FrameworkPropertyMetadata에 메타 데이터 유형을 지정하고 적절한 기본값을 제공하는 것이 좋습니다.

더 많은 가치를 부여하려면 : 바인딩에 "PresentationTraceSources.TraceLevel = High"를 추가하면 바인딩이 그 값을 얻는 방법에 대해 많은 정보가 제공되어 많은 도움이되며 오류가 아닌 문제를 찾습니다. WPF.

<TextBox Text="{Binding MyText, PresentationTraceSources.TraceLevel=High}"/> 
+0

TraceLevel에 대한 정보를 추가해 주셔서 감사합니다. 지금 당분간 찾고있는 내용입니다. –