none
TreeView绑定问题. RRS feed

  • 问题

  • 条件:
        现在有一个Dictionary<String, List<**Entity>>
    键存放的是图层,值为该图层中的所有实体对象.
    问题:
        我现在希望用数据绑定的方式,让一个TreeView中,用图层为子节点,在图层子节点中显示各实体对象.
        一个图层,对应多个实体对象.并且有多个图层.
    = =!
    这个不知道怎么实现..
    帮下~呵呵..先谢谢啦~


    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年11月27日 5:49

答案

  • 楼主你好,
    我现在希望用数据绑定的方式,让一个TreeView中,用图层为子节点,在图层子节点中显示各实体对象.    一个图层,对应多个实体对象.并且有多个图层.

    如果我理解正确的话,你有一个Dictionary<String,AnObject>的数据源,中间这个AnObject继承自ICollection<T>接口,对吧?然后把他们绑定到TreeView上展示出来,我下面重现了一个Dictionary<String,List<String>>的数据源,然后把数据展示出来。
    我们可以用HierarchicalDataTemplate 来展示层次化的数据,如果你不理解中间的ItemsSource属性设置,你可以用一个value converter来查看,把下面TextBlock中的key去掉,那么Convert方法中的value参数就是当前的数据,在本例中,这个value参数是system.Collections.Generic.KeyValuePair<string,System.Collections.Generic.List<int>>类型的,他有两个重要属性:Key,Value.  这样你就更清楚中间的data binding环节了。


    Code snippet: 

    <Window x:Class="WpfDemo.Window2"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:dg="clr-namespace:Microsoft.Windows.Controls;assembly=WpfToolkit"

        xmlns:local="clr-namespace:WpfDemo"

        Title="Window2" Height="300" Width="300">

        <StackPanel>

            <TreeView Name="treeView" >

                <TreeView.ItemTemplate>

                    <HierarchicalDataTemplate ItemsSource="{Binding Path=Value}">

                        <TextBlock Text="{Binding Key, Converter={local:DebugBinding}}" />

                        <HierarchicalDataTemplate.ItemTemplate>

                            <DataTemplate>

                                <TextBlock Text="{Binding}" />

                            </DataTemplate>

                        </HierarchicalDataTemplate.ItemTemplate>

                    </HierarchicalDataTemplate>

                </TreeView.ItemTemplate>

            </TreeView>

        </StackPanel>

    </Window>

    namespace WpfDemo

    {

        public partial class Window2 : Window

        {

            public Window2()

            {

                InitializeComponent();

                Dictionary<string, List<int>> collections = new Dictionary<string, List<int>>();

                for (int i = 0; i < 5; i++)

                {

                    List<int> lists = new List<int>();

                    lists.Add(i);

                    lists.Add(i + 1);

                    lists.Add(i + 2);

                    collections.Add(i.ToString (), lists);

                }

                treeView.ItemsSource = collections;

            }

        }

        public class Converter : IValueConverter

        {

            #region IValueConverter Members

            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

            {

                return value;

            }

            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

            {

                throw new NotImplementedException();

            }

            #endregion

        }  

        public class DebugBindingExtension : MarkupExtension

        {

            public override object ProvideValue(IServiceProvider serviceProvider)

            {

                return new Converter();

            }

        }

    }

    如有其他疑问,请继续回复。
    谢谢。


    Jim Zhou -MSFT
    2009年11月28日 11:00
    版主

全部回复

  • 太抽象了 可以提供代码吗?


    努力学习wpf
    2009年11月27日 12:29
  • 楼主你好,
    我现在希望用数据绑定的方式,让一个TreeView中,用图层为子节点,在图层子节点中显示各实体对象.    一个图层,对应多个实体对象.并且有多个图层.

    如果我理解正确的话,你有一个Dictionary<String,AnObject>的数据源,中间这个AnObject继承自ICollection<T>接口,对吧?然后把他们绑定到TreeView上展示出来,我下面重现了一个Dictionary<String,List<String>>的数据源,然后把数据展示出来。
    我们可以用HierarchicalDataTemplate 来展示层次化的数据,如果你不理解中间的ItemsSource属性设置,你可以用一个value converter来查看,把下面TextBlock中的key去掉,那么Convert方法中的value参数就是当前的数据,在本例中,这个value参数是system.Collections.Generic.KeyValuePair<string,System.Collections.Generic.List<int>>类型的,他有两个重要属性:Key,Value.  这样你就更清楚中间的data binding环节了。


    Code snippet: 

    <Window x:Class="WpfDemo.Window2"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:dg="clr-namespace:Microsoft.Windows.Controls;assembly=WpfToolkit"

        xmlns:local="clr-namespace:WpfDemo"

        Title="Window2" Height="300" Width="300">

        <StackPanel>

            <TreeView Name="treeView" >

                <TreeView.ItemTemplate>

                    <HierarchicalDataTemplate ItemsSource="{Binding Path=Value}">

                        <TextBlock Text="{Binding Key, Converter={local:DebugBinding}}" />

                        <HierarchicalDataTemplate.ItemTemplate>

                            <DataTemplate>

                                <TextBlock Text="{Binding}" />

                            </DataTemplate>

                        </HierarchicalDataTemplate.ItemTemplate>

                    </HierarchicalDataTemplate>

                </TreeView.ItemTemplate>

            </TreeView>

        </StackPanel>

    </Window>

    namespace WpfDemo

    {

        public partial class Window2 : Window

        {

            public Window2()

            {

                InitializeComponent();

                Dictionary<string, List<int>> collections = new Dictionary<string, List<int>>();

                for (int i = 0; i < 5; i++)

                {

                    List<int> lists = new List<int>();

                    lists.Add(i);

                    lists.Add(i + 1);

                    lists.Add(i + 2);

                    collections.Add(i.ToString (), lists);

                }

                treeView.ItemsSource = collections;

            }

        }

        public class Converter : IValueConverter

        {

            #region IValueConverter Members

            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

            {

                return value;

            }

            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

            {

                throw new NotImplementedException();

            }

            #endregion

        }  

        public class DebugBindingExtension : MarkupExtension

        {

            public override object ProvideValue(IServiceProvider serviceProvider)

            {

                return new Converter();

            }

        }

    }

    如有其他疑问,请继续回复。
    谢谢。


    Jim Zhou -MSFT
    2009年11月28日 11:00
    版主
  • 楼主,

    如还有疑问,请继续回复。

    谢谢。
    Jim Zhou -MSFT
    2009年11月30日 7:31
    版主