【问题标题】:What's the correct way to do this <Image Source="../Images/{Binding Path=Id}.jpg"/>?<Image Source=".​​./Images/{Binding Path=Id}.jpg"/> 的正确方法是什么?
【发布时间】:2013-03-22 22:27:49
【问题描述】:

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

所以我认为是这样的

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

这不是有效的 XAML。

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

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

【问题讨论】:

  • 谢谢,希望保留一切 xaml...
  • 如果你想把它全部保存在 XAML 中,你必须使用基于 Id 值的 DataTriggers。 &lt;DataTrigger Binding="{Binding Id}" Value="1"&gt;&lt;Setter Property="Source" TargetName="Image" Value="../Images/1.jpg"/&gt;&lt;/DataTrigger&gt;。另外,请改用支持透明度的 PNG。
  • 您的场景正是绑定转换器的用途。
  • 迟到了,但我认为不应该永远为了在 XAML 中做任何事情而选择 XAML。为此目的创建了价值转换器。下一个最好的事情是实现自定义标记扩展,它允许您在标记中使用自定义逻辑 - 但您仍然在某处依赖 C# 代码。过于努力地保留它 XAML 不可避免地会导致不必要且混乱的标记。

标签: wpf data-binding


【解决方案1】:

您必须使用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>

【讨论】:

  • 希望StringFormat 直接在主绑定上工作,但它似乎只在目标属性为string 类型时才工作。 +1 用于隐藏文本的有趣替代方案,即使我永远不会使用它;)
  • 我使用了这个转换器解决方案。我想知道为什么隐藏的文本块不是最佳实践。我是 WPF 的新手,很高兴听到为什么不做这样的事情。谢谢。
猜你喜欢
  • 2013-01-04
  • 2010-10-25
  • 1970-01-01
  • 2017-02-13
  • 2010-11-07
  • 1970-01-01
  • 2020-01-31
  • 2020-06-25
  • 1970-01-01
相关资源
最近更新 更多