2009-03-31 8 views
3

메뉴가 포함 된 UserControl이 있습니다. Menu.Icon을 UserControl의 속성에 바인딩해야하지만 작동하지 않습니다.WPF - 메뉴 아이콘에 바인딩

코드는 다음과 같이 시작 -

 <Border Grid.Row="0">    
     <DockPanel> 
      <Image x:Name="testImage" Height="16" Width="16" Source="{Binding ElementName=UC,Path=AddImage}"/> 
      <Menu DockPanel.Dock="Left" Height="20" 
       VerticalAlignment="Center"> 
       <MenuItem Header="{Binding ElementName=UC,Path=AddText}"> 
        <MenuItem.Icon> 
         <!--<Image x:Name="workswhenin" Height="16" Width="16" Source="pack://application:,,/Kowdox;component/Images/UserIcons/user_add.png"/>--> 

         <Image x:Name="realImage" Height="16" Width="16" 
         Source="{Binding ElementName=UC,Path=AddImage}"/> 
        </MenuItem.Icon> 
       </MenuItem> 

당신이 선언을 참조하십시오 첫 번째 이미지 (testImage)은 완벽하게 작동 그래서 바인딩이 올바른지 행복 해요. 두 번째 Image (주석 처리되고 이름이 'workswhenin')에는 UserControls 바운드 속성에 전달하는 팩 URI가 포함되어 있지만 작동하지만 세 번째 이미지 (realImage)는 전혀 표시되지 않습니다.

왜 작동하지 않아야하는지 알 수 없습니다. 나는 바인딩이 좋음을 알고 있으며 마크 업에서의 이미지 배치가 좋음을 알고 있습니다.

도움이 될 것입니다. 미리 감사드립니다.

답변

5

코드가 보이지 않아서 확실하게 알 수 없지만 문제가 무엇인지 압니다.

Image.Source에는 ImageSource 유형의 개체가 필요합니다. XAML에서 URL을 지정하면 기본 WPF 변환기를 사용하여 URL을 ImageSource 개체로 변환합니다. 바인딩을 사용 중이므로 기본 변환기가 사용되지 않습니다. 따라서 이미지 소스를 ImageSource 개체 대신 URL 값으로 설정하려고합니다.

코드 숨김 속성에서는 ImageSource 개체를 만들어야합니다. 이는 실제로 고통입니다. BitmapImage을 만들고 URL을 전달할 수 있습니다.

가장 쉬운 해결책은 바인딩하려는 코드 숨김 속성에서 Microsoft의 기본 변환기를 사용하거나 바인딩에서 명시 적으로 사용하는 것입니다. 변환기는 ImageSourceConverter입니다.

편집 : 바인딩 소스의 내부

코드 :

public ImageSource AddImageSource 
{ 
    get 
    { 
     ImageSourceConverter imgConv = new ImageSourceConverter(); 
     return imgConv.ConvertFrom(this.AddImage); 
    } 
} 

업데이트를 바인딩이 속성 대신 AddImage 속성을 대상으로 여기

간단한 예입니다. AddImage 속성이 변경 될 때도이 속성의 PropertyChanged 이벤트가 발생하는지 확인하십시오.

테스트 시나리오를 작성하는 데 시간이 걸리지는 않았지만 문제없이 작동해야합니다.

+0

이 질문은 단지 1000 번째 시간 동안 보았고 아직도 (도움이되고 정확한) 대답은 오직 하나의 upvote를 얻습니다. 사람들은 대답이 유용 할 때 더 많은 투표를해야합니다. – Stimul8d

+0

@Josh G : 예, 예제 코드를 게시하십시오. – kevinarpe

+0

@KCArpe : 완료. 편집을 참조하십시오. –