2010-11-18 80 views
2

我想根據DataContextChildWindow中設置圖像的源。這裏是XAML文件:Silverlight中的動態圖像源綁定

<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> 

它的正常工作,如果我重寫ChildWindowShow方法和設置圖像的源:

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

但它看起來醜陋,這不是「Silverlight的方式」 ,所以我決定改變:

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

你看,我有一個DialogIconConverter註冊從DataContext源綁定。

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的一個實例將被分配給DialogWindowDataContext屬性。

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

...並查看我的編輯:-) – 2010-11-18 10:23:16

+0

您是否嘗試使用「Images/DialogWindow/Confirm.png」而不是「/Images/DialogWindow/Confirm.png」? – 2010-11-18 10:40:57

+0

@Jakob:試過了,沒有工作。 – 2010-11-18 10:44:44

回答

1

可能是愚蠢的,但是你要確保你的轉換器在您的XAML文件正確引用?

否則,我建議嘗試這種語法爲您的URI路徑(含圖片設置爲資源):

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

編輯:

好吧,我想我已經得到了它: 看看你的輸出窗口,你可能會看到一些錯誤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'中被正確引用,其他一些轉換器在那裏。 – 2010-11-18 12:07:56

+0

@丹尼:我編輯了一些關於我的問題的反思問題 – David 2010-11-18 13:41:48

+0

這是一個錯字!我需要將'DialogIconType'更改爲'IconType'!謝謝! – 2010-11-18 14:13:24

2

假設DialogIconType是路徑到您的圖像(例如 「圖像/ DialogWindow/Confirm.png」),它不經valueconverter工作,如下所示:

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

編輯:

返回路徑從valueconverter的Convert方法的圖像也可能 - 即:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    return "Images/DialogWindow/Confirm.png"; 
} 

編輯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:看我的編輯。 – 2010-11-18 10:07:51

+0

@Danny Chen:...看到我的編輯:-) – 2010-11-18 10:22:39

+0

@Jakob:不工作。因爲'Image'的'Source'屬性是'ImageSource'類型,而不是'string'類型。我們可以將XAML中的字符串值賦給'Source'屬性,因爲它將被轉換爲'ImageSource',因爲'Image'類中有一個名爲'SourceProperty'的'DependencyProperty'。但是如果你實現你自己的'Converter',你必須返回確切的類型。 – 2010-11-18 10:31:15