Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 基于数据类型的UserControl更新映像_Wpf_Image_Mvvm_Resourcedictionary - Fatal编程技术网

Wpf 基于数据类型的UserControl更新映像

Wpf 基于数据类型的UserControl更新映像,wpf,image,mvvm,resourcedictionary,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="CompanyIcon">../Images/companies_32.png</ImageSource>
<ImageSource x:Key="EmployeeIcon">../Images/employee_32.png</ImageSource>
<ImageSource x:Key="CustomerIcon">../Images/customer_32.png</ImageSource>
。/Images/companys\u 32.png
../Images/employee_32.png
../Images/customer_32.png
在我的viewmodel中,我希望根据使用的数据类型分配图像。例如,如果我正在查看一家公司的信息(使用EF 4.5查看类型为“company”的DBContext),我希望将图像设置为“CompanyIcon”


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

我所做的是在VM中有一个字符串属性指向图像位置(不知道这是否是最好的方法,但对我来说效果相当好):

在XAML中:

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

我会使用一个
数据触发器
,根据对象类型设置
图像.Source
,并使用一个转换器返回
类型(值)
,以获取类型

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

谢谢。您能告诉我样式是否存储在ResourceDictionary中吗?然后如何在网格布局中实现此样式?@BrianKE该样式可以放置在XAML中的任何
标记中,例如
,或者
ResourceDictionary
,然后您必须制作
图像e> 应用样式,例如
在vm中这样做的问题是,您不必要地模糊了关注点的分离,这只能作为最后的手段。不尊重关注点的分离将导致臃肿和脆弱的视图模型。在这种情况下,图像显示是一个视图关注点,很容易处理一旦你知道了怎么做,你就可以看到风景。Cheers@Berryl是的。你建议如何处理这个问题?在这种特殊情况下,你需要按类型改变一个控件的图像?实际上,我喜欢Rachel在这里提出的解决方案。示例说明如何使用DataTemplates和mplicit数据类型。而且FWIW我以前也尝试过将类似的东西塞进我的视图模型!这似乎是个好主意,直到我发现我的视图模型不必要地臃肿和脆弱。。。
<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
}