Wpf 什么';这是正确的方法<;图像源="/Images/{Binding Path=Id}.jpg"/>;?

Wpf 什么';这是正确的方法<;图像源="/Images/{Binding Path=Id}.jpg"/>;?,wpf,data-binding,Wpf,Data Binding,我有一个员工ID和一个与中该员工关联的图像,作为项目中的资源(该图像显示在员工姓名旁边的列表中) 我想是这样的 <DataTemplate DataType="{x:Type m:Employee}"> <Grid> <Image Grid.Column="0" Name="image" Source="../Images/{Binding Path=Id}.jpg"/> 它不是有效的XAML 我想我可以在code

我有一个员工ID和一个与中该员工关联的图像,作为项目中的资源(该图像显示在员工姓名旁边的列表中)

我想是这样的

<DataTemplate DataType="{x:Type m:Employee}">
        <Grid>
            <Image Grid.Column="0" Name="image" Source="../Images/{Binding Path=Id}.jpg"/>

它不是有效的XAML

我想我可以在codebehind中处理一些数据绑定事件并在那里创建路径?对我来说并不理想


我可以将路径存储在Employee类中,但这太糟糕了。

您必须使用
IValueConverter

下面是一个传递
字符串.Format
作为转换器参数的简单示例

public class StringFormatToImageSourceConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (parameter is string)
        {
            return string.Format(parameter.ToString(), value);
        }
        return null;
    }

    public object ConvertBack(object value, Type targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }
}
用法:

<XXXX.Resources>
    <local:StringFormatToImageSourceConverter x:Key="StringToImage" />
</XXXX.Resources>

<Image Source="{Binding Path=Id, Converter={StaticResource StringToImage}
     , ConverterParameter=../Images/{0}.jpg}" />

谢谢,我希望把它全部保存在xaml中……如果你想把它全部保存在xaml中,你必须使用基于Id值的DataTriggers<代码>。另外,请改用支持透明性的PNG。您的场景正是绑定转换器的用途。对话进行到很晚,但我认为不应该为了在XAML中完成所有工作而选择XAML。为此目的创建了价值转换器。下一个最好的方法是实现自定义标记扩展,它允许您在标记中使用自定义逻辑,但您仍然会在某些地方依赖C#代码。试图将其保存为XAML不可避免地会导致不必要和混乱的标记。希望
StringFormat
可以直接在主绑定上工作,但它似乎只有在目标属性类型为
string
时才起作用+1用于隐藏文本的有趣替代方案,即使我永远不会使用它;)我使用了这个转换器解决方案。我想知道为什么隐藏文本块不是最佳实践。我是WPF的新手,听到为什么不做这样的事情会很高兴。谢谢
<Grid>
    <TextBlock x:Name="StringToImage" Visibility="Hidden" Text="{Binding Id, StringFormat=../Images/{0}.jpg}" />
    <Image Source="{Binding Text, ElementName=StringToImage}"/>
</Grid>