这个问题的正确做法是什么? <Image Source="../Images/{Binding Path=Id}.jpg"/>?

5
我有一个员工ID和与该员工相关联的图像作为项目中的资源(该图像在员工姓名旁边的列表中显示)。
所以我认为应该像这样:
<DataTemplate DataType="{x:Type m:Employee}">
        <Grid>
            <Image Grid.Column="0" Name="image" Source="../Images/{Binding Path=Id}.jpg"/>

这不是有效的XAML。

我想我可以在代码后台处理一些数据绑定事件并在那里创建路径?但这对我来说似乎不是最理想的方法。

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


谢谢,希望能保持全部使用XAML... - Jim W says reinstate Monica
1
如果您想全部保留在XAML中,您必须使用基于Id值的DataTriggers。 <DataTrigger Binding="{Binding Id}" Value="1"><Setter Property="Source" TargetName="Image" Value="../Images/1.jpg"/></DataTrigger>。此外,请使用支持透明度的PNG格式。 - Federico Berasategui
1
你的情况正是绑定转换器的用途所在。 - Clemens
虽然我来晚了,但我认为人们不应该仅仅为了使用XAML而选择XAML。值转换器就是为此而创建的。下一个最好的选择是实现自定义标记扩展,它允许您在标记中使用自定义逻辑 - 但您仍然需要在某个地方回退到C#代码。过于努力地保持XAML不可避免地会导致不必要和混乱的标记。 - erodewald
1个回答

9
您需要使用一个 IValueConverter
下面是一个简单的示例,将 String.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}" />

有一种方法可以通过使用不可见的 TextBlock 格式化字符串,但这不是最佳实践。你可以在 Xaml 中保留所有内容。

<Grid>
    <TextBlock x:Name="StringToImage" Visibility="Hidden" Text="{Binding Id, StringFormat=../Images/{0}.jpg}" />
    <Image Source="{Binding Text, ElementName=StringToImage}"/>
</Grid>

1
希望StringFormat可以直接在主绑定上工作,但似乎只有当目标属性为string类型时才能工作。 对于有隐藏文本的有趣替代方案,我给一个赞,即使我永远不会使用它 ;) - JYL
1
我使用了这个转换器解决方案。我想知道为什么隐藏的文本块不是最佳实践。我是WPF的新手,很高兴听到为什么不要做这样的事情。谢谢。 - digthewells

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接