我可以将文本块的内容仅绑定到可观察集合中字符串的一部分吗?

时间:2011-08-17 08:49:00

标签: wpf string binding path observablecollection

我对WPF比较陌生,如果有一个明显或简单的答案,我没有看到,请为此道歉。

我有一个ObservableCollection项目,每个项目都有几个不同大小的图像。 每个图像的相对路径是字符串格式,图像文件存储在不同的子文件夹中。

图像路径的格式为:

imagepath = @"subfolder/subfolder/filename.png"

我希望能够绑定到文本块,但只显示每个图像下方的文件名而不更改图像路径。这可能吗?我认为它需要某种类型的转换器,但我一直在努力,因为我找不到合理的方式只显示字符串的一部分。

感谢您的帮助。

修改

为了澄清,我的'值'是非静态的,引用可观察集合中的项目,例如。

ObservableCollection<Icon> items = new ObservableCollection<Item>();

items.Add(new Item{imagename = "someimagename",
imagepath= "somefolder/somesubfolder/somefilename.png"}) etc...

我只是开始掌握来自我的收藏品中的“获取”价值。填写'value.Tostring()'部分来获取item.imagepath的动态值的任何帮助都会非常感激,所以我可以使用它。

我目前一直在尝试这些方面:

class getFilenameFromPathConverter : IValueConverter
 {     
    public object Convert(object value, Type targetType, object parameter,
    System.Globalization.CultureInfo culture)

      {    Item item = value as Item; 
           PropertyInfo info = value.GetType().GetProperty("imagepath");
           string filename = info.GetValue(item, null).ToString();
           return System.IO.Path.GetFileNameWithoutExtension(filename); } 

    public object ConvertBack(object value, Type targetType, object parameter,
       System.Globalization.CultureInfo culture)
       {
          throw new NotImplementedException();
        }
   }

但我得到一个未处理的异常:System.NullReferenceException:对象引用未设置为对象的实例。

由于

2 个答案:

答案 0 :(得分:1)

您需要获得converter的帮助才能获得此值。

创建一个实现IValueConverter的类,并在Convert方法中返回要显示的字符串部分。

在TextBlock中,绑定到{Binding Path=imagepath, Converter={StaticResource getFilenameFromPathConverter}}

等属性

答案 1 :(得分:1)

脂肪指定的XAML。

您的转换器应如下所示:

class getFilenameFromPathConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return Path.GetFileName(value.ToString());
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}