UserControl基于数据类型更新图像

时间:2012-11-13 19:47:39

标签: wpf image mvvm resourcedictionary

我有一个显示客户,公司或员工信息的程序。我想在此图像旁边显示一个图标,图标会根据我显示的信息类型(客户,公司或员工)而变化。

我在资源字典中有以下设置来指定图像:

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

在我的viewmodel中,我想根据我正在使用的数据类型来分配图像。例如,如果我正在查看公司的信息(使用EF 4.5的“公司”类型的DBContext),我想将图像设置为“CompanyIcon”。

我如何使用viewmodel分配图像(并在我在'Company','Employee'或'Customer'DBContext类型之间切换时更改它)然后将此图像绑定到视图中的占位符(它将是显示在网格列中。)

2 个答案:

答案 0 :(得分:3)

我会使用DataTrigger根据对象类型设置Image.Source,并使用返回typeof(value)的转换器来获取类型

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

答案 1 :(得分: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}" .../>