質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

2回答

8478閲覧

ListBoxで選択している項目の番号を通知したい(WPF)

sa_sa

総合スコア15

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2017/03/13 04:31

こんにちは。WPFを勉強中の者です。

###前提・実現したいこと
ViewのListBoxで選択している項目をViewModelに通知する方法を知りたいです。

###発生している問題・エラーメッセージ
簡単な例として、ViewModelにあるコレクションをリストボックスにバインディングして、画面下部にあるボタンを押すとリストボックス上で選択している要素をコレクションから削除するというシステムを考えています。

現段階でボタンを押したらコレクションの先頭の要素を削除する機能は実現できています。選択中のListBoxの項目番号をViewModelに通知することが出来れば任意の要素をコレクションから削除することが出来ると考えています。

以下に自分で作ったソースを置きます。
何卒よろしくお願いいたします。

###該当のソースコード

ListAddRemoveViewプロジェクト MainWindow.xaml ------------------------------------------ <Window x:Class="ListAddRemoveView.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="*" /> <RowDefinition Height="20" /> </Grid.RowDefinitions> <ListBox Name="listbox" Grid.Column="0" ItemsSource="{Binding}"> <ListBox.ItemTemplate> <HierarchicalDataTemplate> <TextBlock Text="{Binding Name}" /> </HierarchicalDataTemplate> </ListBox.ItemTemplate> </ListBox> <Button Name="button" Content="RemoveButton" Grid.Row="1" Command="{Binding RemoveElement}" /> </Grid> </Window> MainWindow.xaml.cs --------------------------------------- using System.Windows; using ListAddRemoveViewModel; namespace ListAddRemoveView { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); this.DataContext = new MainWindowViewModel(); } } } ListAddRemoveViewModelプロジェクト MainWindowViewModel.cs -------------------------------------------- using System.Collections.ObjectModel; using System.Windows.Input; using Microsoft.Practices.Prism.Commands; namespace ListAddRemoveViewModel { public class MainWindowViewModel :ObservableCollection<Person> { public MainWindowViewModel() { Add(new Person { Name = "Human01" }); Add(new Person { Name = "Human02" }); Add(new Person { Name = "Human03" }); Add(new Person { Name = "Human04" }); Add(new Person { Name = "Human05" }); } private ICommand removeElement; public ICommand RemoveElement { get { return removeElement = new DelegateCommand(removeMethod); } } private void removeMethod() { RemoveAt(0); } } public class Person { private string name; public string Name { get { return name; } set { name = value; } } } }

###補足情報(言語/FW/ツール等のバージョンなど)
言語 C#
開発環境 Visual Studio 2013
Microsoft .NETFramework 4.6.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

単一選択モードであれば、ListBox.SelectedItemにViewModelのプロパティをバインドさせて、ViewModel側へ選択インスタンスを通知する方法もあります。

XML

1<ListBox Name="listbox" Grid.Column="0" 2 ItemsSource="{Binding People}" 3 SelectedItem="{Binding SelectedPerson}"> 4 <ListBox.ItemTemplate> 5 <HierarchicalDataTemplate> 6 <TextBlock Text="{Binding Name}" /> 7 </HierarchicalDataTemplate> 8 </ListBox.ItemTemplate> 9</ListBox>

C#

1public class MainWindowViewModel : INotifyPropertyChanged 2{ 3 public ObservableCollection<Person> People { get; set; } 4 = new ObservableCollection<Person>(); 5 6 private Person _SelectedPerson = null; 7 public Person SelectedPerson 8 { 9 get { return _SelectedPerson; } 10 set 11 { 12 _SelectedPerson = value; 13 OnPropertyChanged(); 14 } 15 } 16 17 public MainWindowViewModel() 18 { 19 People.Add(new Person { Name = "Human01" }); 20 People.Add(new Person { Name = "Human02" }); 21 People.Add(new Person { Name = "Human03" }); 22 People.Add(new Person { Name = "Human04" }); 23 People.Add(new Person { Name = "Human05" }); 24 } 25 26 public event PropertyChangedEventHandler PropertyChanged; 27 28 protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 29 { 30 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 31 } 32}

※DelegateCommandは今回の問題には不要なので割愛しました。

投稿2017/03/13 05:09

編集2017/03/13 11:29
Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sa_sa

2017/03/13 11:16

ご回答ありがとうございます。 ですが、私の知識が足りなさ過ぎて理解が追い付いていない状態です… もしよろしければどこにどう記述すれば良いか具体的にご教授いただいてもよろしいでしょうか。
Tak1wa

2017/03/13 11:29

例を追記しました
sa_sa

2017/03/14 03:02

補足のご説明でようやく納得ができました。本当にありがとうございました!
guest

0

personに selectedをバインドさせるようにするといい。項目番号はいらない。
この記事を参考にするといいかと http://qiita.com/wonderful_panda/items/36bf500094cc42f7ea97

投稿2017/03/13 04:53

kiichi54321

総合スコア1984

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sa_sa

2017/03/14 03:04

ご回答ありがとうございます。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問