我有一个显示客户,公司或员工信息的程序。我想在此图像旁边显示一个图标,图标会根据我显示的信息类型(客户,公司或员工)而变化。
我在资源字典中有以下设置来指定图像:
<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类型之间切换时更改它)然后将此图像绑定到视图中的占位符(它将是显示在网格列中。)
答案 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}" .../>