У меня есть TreeView, импортированный из WinRT.XamlToolKit, который я пытаюсь использовать в универсальном приложении. Важно отметить, что я понимаю, что есть похожие вопросы, но некоторые из них не работают либо потому, что они предшествуют универсальным приложениям, либо не подходят для использования MVVM. После урока, чтобы понять, как заполнить дерево, я наткнулся на этот рекурсивный метод:Рекурсивно добавлять элементы в TreeView
private ObservableCollection<TreeViewItemModel> BuildTree(int depth, int branches)
{
var tree = new ObservableCollection<TreeViewItemModel>();
if (depth <= 0) return tree;
var depthIndices = Enumerable.Range(0, branches).Shuffle();
for (var i = 0; i < branches; i++)
{
var d = depthIndices[i] % depth;
var b = _rand.Next(branches/2, branches);
tree.Add(
new TreeViewItemModel
{
Branch = b,
Depth = d,
Text = "Item " + _itemId++,
Children = BuildTree(d, b)
});
}
return tree;
}
Это называется такой TreeItems = BuildTree(5,5);
тогда я связать свою TreeView ItemSource к и прикрепить элементов дерева к текстовому свойству TreeViewItemModel.
Это работает для предопределенного набора, а затем, как видно из метода, использует случайные числа для определения того, как дерево будет отображаться. (В каких глубинах, количестве ветвей и т. Д.)
Что я не уверен в том, как реализовать подобную рекурсивную функцию для заполнения дерева с помощью другого ItemModel с неопределенным количеством детей. В моей настройке у меня есть Пробел, который может иметь дочерние пространства, устройства и/или датчики. В пространстве не было бы ни устройств, ни датчиков, кроме одного или нескольких детских пространств или у него не было бы детских пространств, но у него могли быть устройства и/или датчики. В моем классе Sensor у него есть идентификатор родителя, соответствующий идентификатору пространства, к которому он привязан, и устройству, которому он подчиняется.
Итак, одним словом, мне нужно заполнить мой ObservableCollection<TreeViewSpaceModel>
рекурсивно из списка пространств.
TreeViewSpaceModel класс:
public class TreeViewSpaceModel : NotifyObject
{
private string _name;
private Guid _iD;
private string _parentName;
private ObservableCollection<TreeViewSpaceModel> _children = new ObservableCollection<TreeViewSpaceModel>();
private ObservableCollection<TreeViewDeviceModel> _devices = new ObservableCollection<TreeViewDeviceModel>();
private ObservableCollection<TreeViewSensorModel> _sensors = new ObservableCollection<TreeViewSensorModel>();
public string Name
{
get { return _name; }
set { SetProperty(ref _name, value); }
}
public string ParentName
{
get { return _parentName; }
set { SetProperty(ref _parentName, value); }
}
public Guid Id
{
get { return _iD; }
set { SetProperty(ref _iD, value); }
}
public ObservableCollection<TreeViewSpaceModel> Children
{
get { return _children; }
set { SetProperty(ref _children, value); }
}
public ObservableCollection<TreeViewDeviceModel> Devices
{
get { return _devices; }
set { SetProperty(ref _devices, value); }
}
public ObservableCollection<TreeViewSensorModel> Sensors
{
get { return _sensors; }
set { SetProperty(ref _sensors, value); }
}
}
DeviceModel не имеет детей, но у него есть датчики, и SensorModel не имеет детей или устройств или датчиков, как это конец иерархии. Космический класс:
public class Space
{
public Guid Id { get; set; }
public string Name { get; set; }
public int SpaceTypeId { get; set; }
public virtual Space Parent { get; set; }
public virtual ICollection<Sensor> Sensors { get; set; }
public virtual ICollection<Device> Devices { get; set; }
public virtual ICollection<Space> Children { get; set; }
}
Конечный результат будет идеально выглядеть примерно так:
Space1
---- ChildSpace1
--------Device1
-------------Sensor1
-------------Sensor2 (Sensors report for Spaces, but are bound to Devices)
--------SubChildSpace1
-------------Sensor1
-------------Sensor2
--------SubChildSpace2
-------------Sensor1
------------Sensor2
--------Device2
---- ChildSpace2
Space2
Если есть более простой способ сделать это вместо рекурсивного метода, я рад, чтобы развлечь его. Изучая TreeViews для универсальных приложений, я столкнулся с кем-то другим, говорящим, что пользователь должен иметь возможность делать что-то вроде items.Node(0).Add(stuffhere)
, однако я не мог понять, как этого добиться, поскольку ObservableCollection не предлагает расширение .Node.
Почему 'space.Parent == null'? – TekGiant
Чтобы получить корни, я думаю? Но это ваш код, поэтому не стесняйтесь его менять. –
О, ладно. Кроме того, как выглядит класс TreeViewItemModel в этом случае. Причина, по которой я спрашиваю об этом, заключается в том, что в моей текущей итерации я не использую класс TreeViewItemModel, который был классом, который использовался в примере рекурсивного метода, который я показал в начале. – TekGiant