WPF中将datatable中数据绑定到treeview上。

luckapple2 2008-11-26 02:54:25
WPF中将datatable中数据绑定到treeview上。
共三层
datatable中的数据 TreeView绑定后是这样的
1 4 8 --1
1 4 9 ------4
1 4 10 ------------8
1 5 11 ------------9
1 5 12 ------------10
1 5 13 ------5
2 6 14 ------------11
2 6 15 -------------12
2 6 16 ------------13
2 6 17 --2
2 6 18 ------6
------------14
------------15
-------------16
------------17
------------18
有什么好的方法能实现,在线等待。
...全文
471 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouyongh 2008-12-01
  • 打赏
  • 举报
回复
数据绑定UI只是显示数据的,要么你把数据排好顺序传递给UI,要么你在获得数据源后重新组织一下数据的顺序(包括WPF给你默认提供的中间View或者你自己写的ViewModel),无它法。

给你写了一个:

[code=XAML]
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="Window1" Height="300" Width="300" Name="MainWindow">
<Window.Resources>
<local:DataTableToTreeViewSourceConverter x:Key="DataTableToTreeViewSourceConverter"/>

<HierarchicalDataTemplate x:Key="ItemDataTemplate" ItemsSource="{Binding Path=Children}">
<TextBlock Text="{Binding Path=Value}"/>
</HierarchicalDataTemplate>

</Window.Resources>
<Grid>
<TreeView Margin="64,21,94,41" Name="treeView1"
ItemTemplate="{StaticResource ItemDataTemplate}"
ItemsSource="{Binding ElementName=MainWindow, Path=DataTable, Converter={StaticResource DataTableToTreeViewSourceConverter}}"/>
</Grid>
</Window>
[/code]


/// <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;
}
}
}


Hope helps
luckapple2 2008-11-27
  • 打赏
  • 举报
回复
难呀。我弄了好几天了。
ms44 2008-11-27
  • 打赏
  • 举报
回复
这样绑定没做过,如果你觉得复杂么,就CODE吧。不是更简单么?
mljzhy 2008-11-26
  • 打赏
  • 举报
回复
绑定有点麻烦,不绑定还好弄
luckapple2 2008-11-26
  • 打赏
  • 举报
回复
这么难吗。

8,734

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧