teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

Indexプロパティを使用した方法を追記

2017/08/21 08:37

投稿

neelabo
neelabo

スコア60

answer CHANGED
@@ -78,4 +78,65 @@
78
78
  </DataTemplate>
79
79
  </ListBox.ItemTemplate>
80
80
  </ListBox>
81
+ ```
82
+
83
+ ----
84
+ **(追記)**
85
+ データにIndexプロパティを持たせられるのであれば、ValueConverterも使用しない素直な実装になります。
86
+ 以下の例では項目変更時に全ての`Index`を更新するようにしていますが、項目を入れ替える時にその項目の`Index`も入れ替える、という方法もあります。
87
+
88
+ ```C#
89
+ public partial class MainWindow : Window
90
+ {
91
+ public ObservableCollection<MyItem> Collection { get; } = new ObservableCollection<MyItem>()
92
+ {
93
+ new MyItem{ ItemName="item1" },
94
+ new MyItem{ ItemName="item2" },
95
+ new MyItem{ ItemName="item3" },
96
+ new MyItem{ ItemName="item4" },
97
+ new MyItem{ ItemName="item5" }
98
+ };
99
+
100
+ public MainWindow()
101
+ {
102
+ InitializeComponent();
103
+ this.DataContext = this;
104
+
105
+ RefleshCollectionIndex();
106
+ this.Collection.CollectionChanged += (s, e) => RefleshCollectionIndex();
107
+ }
108
+
109
+ public void RefleshCollectionIndex()
110
+ {
111
+ for (int i = 0; i < this.Collection.Count; ++i)
112
+ {
113
+ this.Collection[i].Index = i;
114
+ }
115
+ }
116
+ }
117
+
118
+ //
119
+ public class MyItem : INotifyPropertyChanged
120
+ {
121
+ public event PropertyChangedEventHandler PropertyChanged;
122
+ protected void RaisePropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string name = null)
123
+ {
124
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
125
+ }
126
+
127
+ private int _index;
128
+ public int Index
129
+ {
130
+ get { return _index; }
131
+ set { if (_index != value) { _index = value; RaisePropertyChanged(); } }
132
+ }
133
+
134
+ private string _itemName;
135
+ public string ItemName
136
+ {
137
+ get { return _itemName; }
138
+ set { if (_itemName != value) { _itemName = value; RaisePropertyChanged(); } }
139
+ }
140
+ }
141
+
81
142
  ```