2013-03-22 30 views
3

我在学习WPF,不确定最好的方法是什么;我有一个员工ID和与该员工相关的图像作为项目中的资源(该图像显示在员工姓名旁边的列表中)。这是做什么的正确方法<Image Source =“../ Images/{Binding Path = Id} .jpg”/>?

所以我觉得这样的事情

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

这不是有效的XAML。

我想我可以在代码隐藏中处理一些数据绑定事件并在那里创建路径?对我来说看起来并不理想。

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

感谢

+3

使用转换器 – 2013-03-22 22:34:57

+0

谢谢,希望能保持它的所有XAML ... – 2013-03-22 22:46:41

+1

如果你想保持它所有在XAML中,你必须使用基于ID值DataTriggers。 '。此外,使用PNG代替支持透明度。 – 2013-03-22 22:52:22

回答

7

你将不得不使用IValueConverter

继承人一个简单的例子在String.Format传递作为转换器paramerter

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}" /> 

有一种方法将其全部保存在中3210通过使用不可见的TextBlock来格式化字符串,但不是最佳实践。

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

希望'StringFormat'直接在主Binding上工作,但它似乎只在目标属性是'string'类型时才起作用。 +1为有趣的替代与隐藏文本,即使我永远不会使用它;) – JYL 2013-03-23 00:20:41

+0

谢谢 - 并很好地了解StringFormat太... – 2013-03-24 03:51:28

+1

我用这个转换器的解决方案。我想知道为什么隐藏的文本块不是最佳实践。我是WPF的新手,很高兴听到为什么不这样做。谢谢。 – digthewells 2016-06-07 21:16:44

相关问题