2012-11-13 44 views
1

我有一個程序,顯示客戶,公司或員工的信息。我想在此圖像旁顯示一個圖標,並根據我顯示的信息類型(客戶,公司或員工)更改圖標。UserControl更新圖像基於數據類型

我在我的資源字典以下設置指定圖片:

<ImageSource x:Key="CompanyIcon">../Images/companies_32.png</ImageSource> 
<ImageSource x:Key="EmployeeIcon">../Images/employee_32.png</ImageSource> 
<ImageSource x:Key="CustomerIcon">../Images/customer_32.png</ImageSource> 

在我的視圖模型,我想基於什麼數據類型我一起工作的形象來分配。例如,如果我正在查看公司的信息(使用EF 4.5的'Company'類型的DBContext),我想將圖像設置爲'CompanyIcon'。

我該如何爲視圖模型分配圖像(並在「公司」,「員工」或「客戶」DBContext類型之間進行更改時將其更改),然後將此圖像綁定到視圖中的佔位符在網格列中顯示)。

回答

3

我會用一個DataTrigger,基於對象類型設置Image.Source,並使用用於獲取類型

返回 typeof(value)一個轉換器0
<Style x:Key="MyStyle" TargetType="{x:Type Image}"> 
    <!-- Default Value --> 
    <Setter Property="Source" Value="{StaticResource CompanyIcon}" /> 

    <Style.Triggers> 
     <DataTrigger Binding="{Binding Converter={StaticResource ObjectToTypeConverter}}" 
        Value="{x:Type local:Employee}"> 
      <Setter Property="Source" Value="{StaticResource EmployeeIcon}" /> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding Converter={StaticResource ObjectToTypeConverter}}" 
        Value="{x:Type local:Customer}"> 
      <Setter Property="Source" Value="{StaticResource CustomerIcon}" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

我通常使用該轉換器看起來就像這樣:

public class ObjectToTypeConverter : IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value == null) 
      return null; 

     return value.GetType(); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 
+0

感謝您。你能告訴我Style是否存儲在ResourceDictionary中?然後,我將如何在網格佈局中實現這種風格? – BrianKE

+0

@BrianKE樣式可以放在XAML的任何''標籤中,比如''或'',或者放在'ResourceDictionary'中,那麼你會必須讓你的'Image'應用樣式,比如'' – Rachel

+0

優秀,像魅力一樣起作用! – BrianKE

0

我所做的是在VM中指向圖像位置的字符串屬性(不知道這是否是最好的方法,但它的工作非常適合我):

private string _imageSource; 
public string ImageSource 
{ 
    get 
    { 
    return _imageSource; 
    } 
    set 
    { 
     _imageSource = value; 
     NotifyPropertyChanged(() => ImageSource); 
    } 

} 

public void SetImage() 
{ 
    If (customer) 
     ImageSource = "../Images/companies_32.png"; 
    ... 
} 
在XAML

<Image Source="{Binding ImageSource}" .../> 
+1

在虛擬機這樣做的問題是,你是不必要的模糊擔憂,這應該只完成作爲最後的手段分離。不尊重關注點的分離將導致臃腫和脆弱的視圖模型。圖像顯示是View的一個重要問題,在這種情況下,只要知道如何,View就可以輕鬆處理。乾杯 – Berryl

+0

@Berryl的確如此。你會如何推薦處理這個呢? –

+0

這種情況下,您需要根據類型更改一個控件的圖像嗎?我喜歡Rachel的解決方案。 [這是另一個](http://stackoverflow.com/questions/13344259/vary-a-xaml-template-by-type/13350720#13350720)示例如何通過類型呈現更復雜的切換可以在DataTemplates中實現和隱式數據類型。 – Berryl