这个问题是这个问题的后续。我从这个站点获得了一些建议,并决定开始学习MVVM实现,以使用 TreeViews。话虽如此,我对 MVVM 还是很陌生,而且我仍然熟悉语法和实现。
我有一个显示整数类型数据的 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;
}
}
视图模型
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;
}
}
}
查看代码隐藏
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;
}
}
非常感谢帮忙。我希望通过这些可以帮助我了解如何编辑和构建 ViewModel,以便我将来可以学习更多即兴创作。
更新
TreeView 现在由字符串组成,因此该部分已解决。不过,我仍然需要默认节点的帮助。我已更新我的代码以反映此更改。