Могу ли я привязать содержимое текстового блока только к части строки в наблюдаемой коллекции? - PullRequest
3 голосов
/ 17 августа 2011

Я относительно новичок в 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 ]

1 голос
/ 17 августа 2011

XAML, как указано в fatty.

Ваш конвертер должен выглядеть следующим образом:

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();
    }
}
1 голос
/ 17 августа 2011

Вам понадобится заручиться помощью конвертера , чтобы получить это значение.

Создайте класс, реализующий IValueConverter, и в методе Convert верните часть строки, которую выхотите отобразить.

В своем текстовом блоке вы привязываетесь к свойству как {Binding Path=imagepath, Converter={StaticResource getFilenameFromPathConverter}}

...