表題の通り、MVVMで構築しているアプリケーションでListBoxを使おうと思っています。
ネットサンプルは一応見たのですが、理解できなかったこともあり自分なりの組み方で動作を確認しました。
コードは以下になります。
C#
1//View 2 <Grid> 3 <ListBox HorizontalAlignment="Left" Margin="80,65,0,126" Width="361" ItemsSource="{Binding list}" SelectedItem="{Binding selectList}" SelectedIndex="{Binding selectIndex}" SelectionMode="Extended" SelectionChanged="ListBox_SelectionChanged"/> 4 <Button Content="Button1" HorizontalAlignment="Left" Height="19" Margin="80,263,0,37" Width="70" Click="Button_Click"/> 5 <Button Content="Button2" HorizontalAlignment="Left" Height="19" Margin="371,263,0,37" Width="70" Click="Button_Click2"/> 6 </Grid>
C#
1//コードビハインド 2 public partial class MainWindow : Window 3 { 4 private MainViewModel viewmodel; 5 public MainWindow() 6 { 7 InitializeComponent(); 8 viewmodel = new MainViewModel(); 9 this.DataContext = viewmodel; 10 } 11 12 //データ追加イベント 13 private void Button_Click(object sender, RoutedEventArgs e) 14 { 15 viewmodel.list.Add("abc1"); 16 viewmodel.list.Add("abc2"); 17 viewmodel.list.Add("abc3"); 18 viewmodel.list.Add("abc4"); 19 viewmodel.list.Add("abc5"); 20 viewmodel.list.Add("abc6"); 21 viewmodel.list.Add("abc7"); 22 viewmodel.list.Add("abc8"); 23 viewmodel.list.Add("abc9"); 24 viewmodel.list.Add("abc10"); 25 viewmodel.list.Add("abc11"); 26 viewmodel.list.Add("abc12"); 27 viewmodel.selectList.Clear(); //初期化状態だと"abc1"にselect状態になってしまうのでリセットさせる 28 } 29 30 //abc7をselect状態にするためのクリックイベント 31 private void Button_Click2(object sender, RoutedEventArgs e) 32 { 33 for (int i = 0; i < viewmodel.list.Count; i++) 34 { 35 string s1 = viewmodel.list[i]; 36 37 if (s1 == "abc7") 38 { 39 viewmodel.selectList.Add(s1); 40 viewmodel.selectIndex = i; 41 } 42 } 43 } 44 45 //select状態が変化した時にVMとデータを同期させるためのイベント 46 private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 47 { 48 ListBox listBox = (ListBox)sender; 49 viewmodel.selectList.Clear(); 50 51 for (int i = 0; i < listBox.SelectedItems.Count; i++) 52 { 53 string s1 = listBox.SelectedItems[i].ToString(); 54 viewmodel.selectList.Add(s1); 55 } 56 } 57 }
C#
1//ViewModel 2 public class MainViewModel : INotifyPropertyChanged 3 { 4 5 private ObservableCollection<string> listVal = new ObservableCollection<string>(); 6 public ObservableCollection<string> list 7 { 8 get { return listVal; } 9 set 10 { 11 listVal = value; 12 NotifyPropertyChanged("list"); 13 } 14 } 15 16 17 18 private int selectIndexVal = new int(); 19 public int selectIndex 20 { 21 get { return selectIndexVal; } 22 set 23 { 24 selectIndexVal = value; 25 NotifyPropertyChanged("selectIndex"); 26 } 27 } 28 29 30 private ObservableCollection<string> selectListVal = new ObservableCollection<string>(); 31 public ObservableCollection<string> selectList 32 { 33 get { return selectListVal; } 34 set 35 { 36 selectListVal = value; 37 NotifyPropertyChanged("selectList"); 38 } 39 } 40 41 42 public event PropertyChangedEventHandler PropertyChanged; 43 private void NotifyPropertyChanged(String info) 44 { 45 if (PropertyChanged != null) 46 { 47 PropertyChanged(this, new PropertyChangedEventArgs(info)); 48 } 49 } 50 }
まだテスト段階でのコードなので大雑把ですが、実アプリケーションでは
・ListBoxの中身を全て取得する
・現在選択されているListの中身を全て取得する
・ListBoxの中身を動的に更新する(中身を全ていれかえる、選択するリストを指定する、の2つしかしません)
の3点ができれば問題ないです。
(そのため現コードでは、ListBoxに「SelectionMode="Extended"」と指定してるにも関わらず、選択されている中身のインデックス位置を取得できないですが、実アプリケーションでは問題ないです)
ただネットのサンプルは他の方法でやっているように見えたので、このコードが間違えた実装になっているのではないかと思っています。
コードは自分が管理するのでできれば複雑なコードではないように修正できればと思うのですが、ご助言いただけないでしょうか。よろしくお願いいたします。


回答1件
あなたの回答
tips
プレビュー