2011년 12월 16일 금요일

How to keep expanded state in RadTreeListView with MVVM

////// Model

public class Task

{

public int id;

public string name;

public ObservableCollection childrens;

}


////// ViewModel


pubilc class TaskViewModel

{

// Define dictionary for storing expanded state

// int: id of item of RadTreeListView

// bool: expanded state, true(expanded) false(folded)

private Dictionary _Expanded;


// Define Get/Set method

public void SetExpanded(int id, bool expanded)

{

if (_Expanded.ContainsKey(id))

{

_Expanded[id] = expanded;

}

else

{

_Expanded.Add(id, expanded);

}

}


public bool GetExpanded(int id)

{

if (_Expanded.ContainsKey(id))

{

return _Expanded[id];

}

return false;

}

}


////// View


// store expanded state when it is changing

private void radTreeListView_RowIsExpandedChanging(object sender, Telerik.Windows.Controls.GridView.RowEventArgs e)

{

TaskViewModel viewModel = this.DataContext as TaskViewModel;

Task task = e.Row.DataContext as Task;

TreeListViewRow row = (TreeListViewRow)TemplateGrid.ItemContainerGenerator.ContainerFromItem(e.Row.Item);

if (row != null && task != null)

viewModel.SetExpanded(task.id, row.IsExpanded);

}


// Set expanded state in DataLoaded event

private void radTreeListView_DataLoaded(object sender, EventArgs e)

{

var source = radTreeListView.ItemsSource as ObservableCollection;

SetExpanded(source)

}


// Recursive method for self-hierarchy collection

private void SetExpanded(ObservableCollection tasks)

{

if (tasks == null)

return;


TaskViewModel viewModel = this.DataContext as TaskViewModel;

foreach (Task task in tasks)

{

if (task.children == null || task.children.Count == 0)

return;


SetExpanded(task.children);


if (viewModel != null)

{

if (viewModel.GetExpanded(task.id))

radTreeListView.ExpandHierarchyItem(task);

else

radTreeListView.CollapseHierarchyItem(task);

}

}

}

댓글 없음:

댓글 쓰기