こんにちは。WPFを勉強中の者です。
プログラミング自体あまり明るくないため、具体的な改善点まで教えていただけると嬉しいです。
###前提・実現したいこと
TreeView上で選択状態にある項目を削除できるようにしたいです。
ツリーでの選択状態の通知ができれば解決すると考えています。
ツリーの任意の項目を選択した状態でボタンを押すと削除できるという仕組みにするつもりです。
###発生している問題・エラーメッセージ
ViewModelに存在するコレクションをTreeViewにバインディングさせています。
以前ListBoxで同じことを行った際にはSelectedItemプロパティを使用することで、選択している項目をViewModel側へ通知しましたが、TreeViewのSelectedItemはListBoxのそれとは仕様が異なるのか同じようにいきません。
以下にここまで作ったソースコードを載せます。当初はxamlのTreeViewに
SelectedItem="{Binding SelectedPerson}"
と記述しViewModelにあるSelectedPersonプロパティとバインディングさせ、removeMethodに
Remove(SelectedPerson)
を書くことで選択項目を削除するつもりでした。
###該当のソースコード
TreeViewAddRemoveViewプロジェクト
MainWindow.xaml ------------------------------------------ <Window x:Class="TreeAddRemove.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> <TreeView Name="treeview" Grid.Row="0" ItemsSource="{Binding TreeObject.People}"> <TreeView.ItemTemplate> <HierarchicalDataTemplate ItemsSource="{Binding Children}"> <TextBlock Text="{Binding Name}" /> </HierarchicalDataTemplate> </TreeView.ItemTemplate> </TreeView> <Button Grid.Row="1" Name="button" Content="RemoveButton" Command="{Binding Person.ChopCommand}" /> </Grid> </Window>
MainWindow.xaml.cs --------------------------------------- using System.Windows; using TreeAddRemoveViewModel; namespace TreeAddRemove { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = new MainWindowViewModel(); } } }
TreeViewAddRemoveViewModelプロジェクト
MainWindowViewModel.cs -------------------------------------------- using GalaSoft.MvvmLight; using GalaSoft.MvvmLight.Command; using System.Collections.ObjectModel; namespace TreeAddRemoveViewModel { public class MainWindowViewModel: ViewModelBase { public TreeObject TreeObject { get; private set; } public Person Person { get; private set; } public MainWindowViewModel() { TreeObject = new TreeObject(); Person = new Person(); } } public class TreeObject : ViewModelBase { private ObservableCollection<Person> people; public ObservableCollection<Person> People { get { return people; } set { people = value; } } public TreeObject() { var p = new Person() { Children = { new Person("Human01") { Children = { new Person("Human02"), new Person("Human03") } } } }; p.SetParent(); People = p.Children; } } public class Person : ViewModelBase { public Person() { } public Person(string name) { Name = name; } private string name; public string Name { get { return name; } set { name = value; } } public Person Parent { get; set; } private ObservableCollection<Person> children = new ObservableCollection<Person>(); public ObservableCollection<Person> Children { get { return children; } set { children = value; } } /// <summary> /// 親子関係の設定 /// </summary> public void SetParent() { foreach (var item in Children) { item.Parent = this; item.SetParent(); } } public void AddChild(Person p) { this.Children.Add(p); p.Parent = this; } private void chop() { if(this.Parent != null) { this.Parent.Children.Remove(this); } //this.Parent?.Children.Remove(this); } #region remove Command /// <summary> /// Gets the remove. /// </summary> public RelayCommand ChopCommand { get { return _chopCommand ?? (_chopCommand = new RelayCommand(() => { chop(); })); } } private RelayCommand _chopCommand; #endregion } }
###補足情報(言語/FW/ツール等のバージョンなど)
言語 C#
開発環境 Visual Studio 2013
Microsoft .NETFramework 4.6.1
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/24 08:58
2017/03/24 09:09
2017/03/24 09:52
2017/03/24 10:04
2017/03/24 11:20
2017/03/24 12:34 編集
2017/03/27 01:37