Этот вопрос является вопросом до this вопроса. Я принял некоторые советы с этого сайта и решил начать обучение MVVM для моей работы с TreeViews. С учетом сказанного я ОЧЕНЬ новичок в MVVM, и я все еще знаком с синтаксисом и реализацией.Как добавить TreeViewItems в элемент управления TreeView
У меня есть TreeView, который отображает данные целочисленного типа, но я бы хотел, чтобы он работал со строками. Дерево также позволяет пользователю добавлять на любой уровень, выбирая TreeViewItem, а затем вводит новый цельный заголовок в текстовое поле, а затем нажимает кнопку.
Я хотел бы для одного из родителей, детей и внуков будут доступны при запуске с предопределенными именами. Еще одна вещь, которую следует отметить, заключается в том, что этот пользователь сможет добавлять к TreeView только на уровне дочернего элемента (чтобы они могли добавлять внуков).
Модель
public class TreeViewModel : PropertyChangedBase
{
public string Value { get; set; }
public ObservableCollection<TreeViewModel> Items { get; set; }
public CollectionView ItemsView { get; set; }
public TreeViewModel(string value)
{
Items = new ObservableCollection<TreeViewModel>();
ItemsView = new ListCollectionView(Items)
{
SortDescriptions =
{
new SortDescription("Value",ListSortDirection.Ascending)
}
};
Value = value;
}
}
ViewModel
public class SortedTreeViewWindowViewModel : PropertyChangedBase
{
private string _newValueString;
public string NewValueString
{
get { return _newValueString; }
set
{
_newValueString = value;
OnPropertyChanged("NewValueString");
}
}
public TreeViewModel SelectedItem { get; set; }
public ObservableCollection<TreeViewModel> Items { get; set; }
public ICollectionView ItemsView { get; set; }
public SortedTreeViewWindowViewModel()
{
Items = new ObservableCollection<TreeViewModel>();
ItemsView = new ListCollectionView(Items) { SortDescriptions = { new SortDescription("Value", ListSortDirection.Ascending) } };
}
public void AddNewItem()
{
ObservableCollection<TreeViewModel> targetcollection;
//Insert the New Node as a Root node if nothing is selected.
targetcollection = SelectedItem == null ? Items : SelectedItem.Items;
if (_newValueString != null)
{
targetcollection.Add(new TreeViewModel(_newValueString));
NewValueString = string.Empty;
}
}
}
View Code-Behind
public partial class Window1 : Window
{
public SortedTreeViewWindowViewModel ViewModel { get { return DataContext as SortedTreeViewWindowViewModel; } set { DataContext = value; } }
public Window1()
{
InitializeComponent();
ViewModel = new SortedTreeViewWindowViewModel()
{
Items = {new TreeViewModel("Test")}
};
}
private void AddNewItem(object sender, RoutedEventArgs e)
{
ViewModel.AddNewItem();
}
private void OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
ViewModel.SelectedItem = e.NewValue as TreeViewModel;
}
}
Спасибо так много е или помощь. Я надеюсь, что это поможет мне понять, как редактировать и создавать ViewModels, чтобы я мог научиться импровизировать немного больше в будущем.
UPDATE
TreeView теперь состоит из строк, так что часть решена. Тем не менее, мне по-прежнему нужна помощь с узлами по умолчанию. Я обновил свой код, чтобы отразить это изменение.
Можете ли вы не просто изменить все объявления типа из int в строку? –
Конечно, но я до сих пор не знаю, как бороться с дефолтом 'TreeViewItems' при запуске. –
Еще один комментарий: я вижу, что вы новичок в MVVM, но имейте в виду, что при реализации MVVM вам редко нужен какой-либо код, кроме установки DataContext в ViewModel. –