【WPF】ListBoxやListViewの行番号を出力する。
- 2008.10.05 Sunday
- 18:01
追記
下記の投稿は問題があることがわかりました。
VirtualizingStackPanel.VirtualizationMode="Recycling"では正常に動作しない。
1.色をしましまにするライブラリーにバグがある。
2.番号が正しく出力されない。
関連)
http://pro.art55.jp/?eid=1168229
-------------------------------------------------------------------
Project and Source
Project and Source(修正)
ええと・・・前に書いたかもしれません。
思いつく限り書き殴っているので・・・ええ。
今回は、ListBoxやListViewの見た目の行番号を出力する方法を紹介します。
動きはこんな感じです。
ドラッグアンドドロップで行を交換します。
ListBoxのItemは交換されていますが、
左端の行番号は上から順に0, 1, 2 ・・・となっていることが確認できます。
いろいろ交換しても大丈夫。ええ。
◆コード
今回は値コンバータを使用しました。
class LineNumberConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var box = value as ListBoxItem;
if (box == null)
return string.Empty;
var itemsControl = ItemsControl.ItemsControlFromItemContainer(box);
return itemsControl.ItemContainerGenerator.IndexFromContainer(box);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
XAMLの記述が面倒なのですが、下記のように書いています。
<TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type ListBoxItem},
AncestorLevel=1},
Converter={StaticResource lineNumberConverter}}"
.../>
う〜ん。ちょっと面倒ですよね。
Project and Source
Project and Source(修正)
ListBoxItemをしましまにするライブラリーにバグが合ったので修正。
--------------
追記)
以前、作成したユーティリティでは
var box = value as ListBoxItem;
if (box == null)
return string.Empty;
var itemsControl = ItemsControl.ItemsControlFromItemContainer(box);
return itemsControl.Items.IndexOf(ListBoxItem.Item);
と、記述しましたが、この違いがあるのかちょっと調べた方が良さそうです。
おそらくitemsControl.Items.IndexOf(ListBoxItem.Item);の場合は見た目の順序での番号がかえってくるはずですが、
ItemsControl.ItemsControlFromItemContainer(box)の場合は違うかもしれません。
下記の投稿は問題があることがわかりました。
VirtualizingStackPanel.VirtualizationMode="Recycling"では正常に動作しない。
1.色をしましまにするライブラリーにバグがある。
2.番号が正しく出力されない。
関連)
http://pro.art55.jp/?eid=1168229
-------------------------------------------------------------------
Project and Source
Project and Source(修正)
ええと・・・前に書いたかもしれません。
思いつく限り書き殴っているので・・・ええ。
今回は、ListBoxやListViewの見た目の行番号を出力する方法を紹介します。
動きはこんな感じです。
ドラッグアンドドロップで行を交換します。
ListBoxのItemは交換されていますが、
左端の行番号は上から順に0, 1, 2 ・・・となっていることが確認できます。
いろいろ交換しても大丈夫。ええ。
◆コード
今回は値コンバータを使用しました。
class LineNumberConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var box = value as ListBoxItem;
if (box == null)
return string.Empty;
var itemsControl = ItemsControl.ItemsControlFromItemContainer(box);
return itemsControl.ItemContainerGenerator.IndexFromContainer(box);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
XAMLの記述が面倒なのですが、下記のように書いています。
<TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type ListBoxItem},
AncestorLevel=1},
Converter={StaticResource lineNumberConverter}}"
.../>
う〜ん。ちょっと面倒ですよね。
Project and Source
Project and Source(修正)
ListBoxItemをしましまにするライブラリーにバグが合ったので修正。
--------------
追記)
以前、作成したユーティリティでは
var box = value as ListBoxItem;
if (box == null)
return string.Empty;
var itemsControl = ItemsControl.ItemsControlFromItemContainer(box);
return itemsControl.Items.IndexOf(ListBoxItem.Item);
と、記述しましたが、この違いがあるのかちょっと調べた方が良さそうです。
おそらくitemsControl.Items.IndexOf(ListBoxItem.Item);の場合は見た目の順序での番号がかえってくるはずですが、
ItemsControl.ItemsControlFromItemContainer(box)の場合は違うかもしれません。