8,734
社区成员
发帖
与我相关
我的任务
分享
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public Window1()
{
DataTable = new DataModel().Data;
InitializeComponent();
}
public DataTable DataTable
{
get;
set;
}
}
public class DataTableToTreeViewSourceConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
DataTable dt = value as DataTable;
if (dt == null)
throw new ArgumentException("DataSource = null");
TreeViewItemViewModel source = new TreeViewItemViewModel(null, -1, 0);
TreeViewItemViewModel item;
TreeViewItemViewModel parent;
for (int j = 0; j <dt.Rows.Count; j++)
{
for (int i = 0; i < dt.Rows[j].ItemArray.Length; i++)
{
item = source.FindItem(i, dt.Rows[j][i]);
if(item == null)
{
parent = i == 0 ? source : source.FindItem(i - 1, dt.Rows[j][i - 1]);
parent.Children.Add(new TreeViewItemViewModel(parent, i, dt.Rows[j][i]));
}
}
}
return source.Children;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException("DataTableToTreeViewSourceConverter only support one-way binding");
}
}
/// <summary>
/// A ViewModel class acts as an adapter between a raw data object and a TreeViewItem.
/// </summary>
public class TreeViewItemViewModel
{
protected readonly TreeViewItemViewModel parent;
protected readonly ObservableCollection<TreeViewItemViewModel> children;
private int _depth;
private object _value;
public TreeViewItemViewModel(TreeViewItemViewModel parent, int depth, object value)
{
this.parent = parent;
this._depth = depth;
this._value = value;
children = new ObservableCollection<TreeViewItemViewModel>();
}
public ObservableCollection<TreeViewItemViewModel> Children
{
get
{
return children;
}
}
public TreeViewItemViewModel Parent
{
get
{
return parent;
}
}
public int Depth
{
get
{
return _depth;
}
set
{
_depth = value;
}
}
public object Value
{
get
{
return _value;
}
set
{
_value = value;
}
}
public TreeViewItemViewModel FindItem(int depth, object value)
{
if(value == null)
return null;
if(depth == Depth)
{
return value.Equals(Value) ? this : null;
}
else if (depth > Depth && children.Count > 0)
{
foreach (TreeViewItemViewModel child in children)
{
TreeViewItemViewModel obj = child.FindItem(depth, value);
if(obj != null)
{
return obj;
}
}
}
return null;
}
}
public class DataModel
{
private DataTable _data;
public DataModel()
{
Data = new DataTable();
//Init DataTable
Data.Columns.Add("A", typeof(int));
Data.Columns.Add("B", typeof(int));
Data.Columns.Add("C", typeof(int));
Data.Rows.Add(1, 4, 8);
Data.Rows.Add(1, 4, 9);
Data.Rows.Add(1, 4, 10);
Data.Rows.Add(1, 5, 11);
Data.Rows.Add(1, 5, 12);
Data.Rows.Add(1, 5, 13);
Data.Rows.Add(2, 6, 14);
Data.Rows.Add(2, 6, 15);
Data.Rows.Add(2, 6, 16);
Data.Rows.Add(2, 6, 17);
}
public DataTable Data
{
get
{
return _data;
}
private set
{
_data = value;
}
}
}