1

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

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

<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 的“公司”类型的 DBContext),我想将图像设置为“公司图标”的图像。

如何将图像分配给视图模型(并在我在“公司”、“员工”或“客户”DBContext 类型之间更改时更改它),然后将此图像绑定到视图中的占位符(它将显示在网格列)。

4

2 回答 2

3

我会使用一个基于对象类型DataTrigger设置的转换器,并使用一个返回的转换器来获取类型Image.Sourcetypeof(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
}
于 2012-11-13T21:01:20.253 回答
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}" .../>
于 2012-11-13T19:54:33.630 回答