2011-08-17 2 views
3

私はWPFには比較的新しいので、私が見ていないという明白な、または簡単な答えがある場合は謝ります。オブザーブブルコレクション内の文字列の一部にのみテキストブロックのコンテンツをバインドできますか?

私は、ObservableCollectionをいくつかの異なるサイズの画像でそれぞれ持っています。 各イメージの相対パスは、イメージファイルが異なるサブフォルダに格納された状態で、文字列形式です。

画像パスは形式である:

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

Iが身に結合できるようにしたいが、画像のパスを変更することなく、各画像の下にファイル名のみを示すであろう。これは可能ですか?私はいくつかの種類のコンバータを必要とするだろうが、私は文字列の一部だけを表示する合理的な方法を見つけることができないので、私はそれで苦労してきた。

ありがとうございました。

編集

明確にするために、私の「の値は、」観察可能なコレクションなどの項目を参照し、非静的です。

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

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

私は自分のコレクションから値を取得することでグリップを始めます。 item.imagepathの動的な値を取得するための 'value.Tostring()'部分の記入に関する助けは本当にありがとうございます。

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:オブジェクト参照がオブジェクトインスタンスに設定されていません。

おかげ

+0

はやって意味: 'リターンシステム.IO.Path.GetFileName(item.imagepath.ToString()); ' – Chris

+0

@Chrisここにテキストボックスの「テキスト」バインディング式(XAML)を貼り付けることはできますか? –

+0

以下の手順に従ってください。 1)コンバータの「変換」メソッドにブレークポイントを設定します。 2)ブレークポイントがヒットすると、渡されている「値」パラメータがチェックされます。 「値」パラメータがファイルパスと等しい場合は、良好です。もし私に知らせてくれないなら。 3)ステップ2が成功したら、変換メソッドを空にして、次の行だけを追加します。 return Path.GetFileNameWithoutExtension(value。ToString()); お試しください。 –

答えて

1

XAMLなどのプロパティにバインドします。

あなたのコンバータは、次のようになります。私はあなたを想定しています「オブジェクト参照が非静的フィールド、メソッド、またはプロパティ...のためにrequriedされ、」取得

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(); 
    } 
} 
+0

ありがとう - これは正しい方向に大きなステップです私はGetFileNameの代わりにGetFileNameWithoutExtensionが必要であることを示します。 しかし、私の 'value'は非観血的で、観測可能なコレクション内のアイテムを参照しています(編集を参照してください) – Chris

1

あなたは、この値を取得するためにconverterの助けを求める必要があります。

IValueConverterを実装するクラスを作成し、Convertメソッドで表示する文字列の一部を返します。あなたのTextBlock内

、あなたは脂肪で指定され{Binding Path=imagepath, Converter={StaticResource getFilenameFromPathConverter}}

+0

ありがとう、ええと私は多くのことを考えました - XAMLを持つのは良いですが、本当に私はConverterと苦労していますが(編集を参照)、@ Zahidのおかげで近いgettign – Chris

関連する問題