2010-11-18 5 views
2

DataContext에 따라 이미지 소스를 ChildWindow에 설정하고 싶습니다. 다음은 XAML 파일은 다음과 같습니다 나는 ChildWindowShow 방법을 무시하고 이미지의 소스로 설정하면 그것은 잘 작동하고실버에서 동적 이미지 소스 바인딩

<controls:ChildWindow x:Class="CEM.Controls.DialogWindow" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls" Title="{Binding Title}"> 
    ... 
    <Image x:Name="DialogIcon"></Image> 
    ... 
</controls:ChildWindow> 

:

public new void Show() 
{ 
    DialogIcon.Source = new BitmapImage(new Uri(@"/Images/DialogWindow/Confirm.png", UriKind.Relative)); 
    base.Show(); 
} 

을하지만 추한 모습과는 "실버 방법"아니다 당신은 내가 DataContext에서 소스를 결합하기가 DialogIconConverter 등록이 볼

<Image x:Name="DialogIcon" Source="{Binding DialogIconType, Converter={StaticResource DialogIconConverter}}"></Image> 

을 : 그래서 나는 변경하기로 결정.

public class DialogIconConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     //currently it's an hard-coded path 
     return new BitmapImage(new Uri(@"/Images/DialogWindow/Confirm.png", UriKind.Relative)); 
    } 
    ... 
} 

하지만 지금은 효과가 없습니다.이 컨트롤에는 다른 여러 변환기가 잘 작동합니다. 이 제품 만 작동하지 않습니다. 문제가있는 곳을 찾을 수 있습니까?

편집 : DialogIconType은 열거 형이며 DialogContext의 속성이기도합니다. DialogContext의 인스턴스는 의 DataContext 속성에 할당됩니다. 아래 그림과 같이 DialogIconType는, 그것이 valueconverter없이 작동을 이미지 (예 : "이미지/DialogWindow/Confirm.png")의 경로라고 가정

public enum DialogIconType 
{ 
    Confirm, 
    Alert, 
    Error 
} 
public class DialogContext 
{ 
    public string Title { get; set; } 
    public string Content { get; set; } 
    public DialogButtons Buttons { get; set; } 
    public DialogIconType IconType { get; set; } 
} 
internal DialogWindow(DialogContext context) 
{ 
    InitializeComponent(); 
    this.DataContext = context; 
} 
+0

... 내 편집을 참조하십시오 :-) –

+0

"/Images/DialogWindow/Confirm.png"대신 "Images/DialogWindow/Confirm.png"를 사용해 보셨습니까? –

+0

@Jakob : 노력하지 않았습니다. –

답변

1

바보 될 수도 있지만 당신은 당신의 컨버터가 당신의 XAML 파일에서 제대로 언급되어 있는지 확인 했습니까?

return new BitmapImage(new Uri("pack://application:,,,/Images/DialogWindow/Confirm.png", UriKind.Relative)); 

편집 :

좋아, 내가 찾은 것 같아 :

그렇지 않으면, 나는 (자원 등의 이미지 설정으로) 당신의 URI에 대한 경로로이 구문을 방문해 귀하의 출력 창을 보면, 당신은 아마 몇 가지 오류 40 바인딩을 볼 수 있습니다 ... blablabla ...

내 생각에 변환기가 맞다는 것이지만 바인딩 소스는 기본적으로 변환기가 n입니다. 심지어 사용.

DialogIconType은 종속성 속성이 아니기 때문에 바인딩 할 수 없습니다.즉

,이 :

public DialogIconType IconType { get; set; } 

이 될해야합니다

public static DependencyProperty IconTypeProperty = DependencyProperty.Register("IconType", typeof(DialogIconType), typeof(DialogContext)); 
public DialogIconType IconType 
{ 
    get { return (DialogIconType)(GetValue(IconTypeProperty)); } 
    set { SetValue(IconTypeProperty , value); } 
} 

플러스, 당신의 XAML에서, 당신은 "IconType"에 바인딩, 그리고해야한다 "DialogIconType"(이 속성이 아닌 유형)

(dependencyProperty가 실제로 여기에 실제로 필요한지 잘 모르겠으므로이 문제가 유일한 문제 일 수도 있습니다. 이제 생각해 보니)

+0

'App.xaml'에서 올바르게 참조되었으므로 다른 변환기도 같이 있습니다. –

+0

@ 대니 : 나는 당신과 관련된 약간의 고찰로 편집했습니다. – David

+0

오타입니다! 'DialogIconType'을'IconType'으로 변경해야합니다! 감사! –

2

:

<Image Source="{Binding DialogIconType}" /> 

편집 : valueconverter의 Convert 방법에서 이미지의 경로를 반환

도 가능합니다 - 예 :

0 1,

편집 2 :

UriKind.Relative을 사용하여 작동 다음 :

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    return new BitmapImage(new Uri("Images/DialogWindow/Confirm.png", UriKind.Relative)); 
} 
+0

@Jakob : 편집을 참조하십시오. –

+0

@ 대니 첸 : ... 내 편집을 참조하십시오 :-) –

+0

@Jakob : 작동하지 않습니다. 왜냐하면'Image'의'Source' 속성은'ImageSource' 유형이기 때문에'string' 타입이 아닙니다. 'Image' 클래스에'SourceProperty'라는 이름의'DependencyProperty'가 있기 때문에 XAML의 문자열 값을'Source' 속성에 할당 할 수 있습니다. 왜냐하면'ImageSource'로 변환되기 때문입니다. 그러나 자신의'Converter '를 구현하면 정확한 타입을 반환해야합니다. –