none
wpf 动态显示数据 RRS feed

  • 问题

  • 大家好;

    我的数据是通过绑定显示的,这样的问题是控件只有在所有数据都添加完之后才会显示数据。我想实现的效果是往集合类里面添加一条数据,控件上就显示一条数据;下面是我的代码:

    xaml ================================

    <Window x:Class="ThreadedWpfExplorer.Window2"

            Loaded="Window_Loaded"

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

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

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

        <Window.Resources>

            <DataTemplate x:Key="listBoxTemplate">

                <TextBlock Text ="{Binding Name}" 

                           Padding="2" FontFamily="宋体" FontWeight="Normal" FontSize="12px" />

            </DataTemplate>

        </Window.Resources>

        <Grid>

            <ListBox Name="lst" Margin="0,68,0,0" ItemTemplate="{StaticResource listBoxTemplate}">

     

            </ListBox>

            <Button Content="Button" Height="27" HorizontalAlignment="Left" Margin="12,12,0,0" Name="button1" VerticalAlignment="Top" Width="78" Click="button1_Click" />

        </Grid>

    </Window>

     

    cs ===================================

     

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Windows;

    using System.Windows.Controls;

    using System.Windows.Data;

    using System.Windows.Documents;

    using System.Windows.Input;

    using System.Windows.Media;

    using System.Windows.Media.Imaging;

    using System.Windows.Shapes;

     

    namespace ThreadedWpfExplorer

    {

        /// <summary>

        /// Window2.xaml 的交互逻辑

        /// </summary>

        public partial class Window2 : Window

        {

            public Window2()

            {

                InitializeComponent();

            }

     

            private void Window_Loaded(object sender, RoutedEventArgs e)

            {

     

            }

     

            private void button1_Click(object sender, RoutedEventArgs e)

            {

                List<Employee> _employees = new List<Employee>();

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

                {

                    Employee temp = new Employee();

                    temp.name = "aaa" + i.ToString();

                    _employees.Add(temp);

                }

                lst.ItemsSource = _employees;

            }

        }

     

     

        public class Employee

        {

            public string name=string.Empty ;

     

            public string Name

            {

                get { return name; }

                set { name=value ;}

            }

        }

    }

    2011年12月13日 8:32

答案

  • 你好Annabella Luo;非常感谢你的回答

    问题的原因是不应该把递归函数写在System.Windows.Application.Current.Dispatcher.Invoke(Action)delegate

                        {
                            
                        });

    • 已标记为答案 xxyxxb2080 2011年12月16日 0:48
    2011年12月15日 9:36

全部回复

  • 上面的Demo是点击button按钮之后,等100条数据全部添加到_employees集合之后,数据才会在控件上展示;我想实现的效果就是在点击button按钮之后,数据添加一条展示一条这样的效果;请问大家要怎么样来修改我的程序才能实现想要的效果?
    2011年12月13日 8:36
  • 大侠们;我找到解决方法了

     ThreadPool.QueueUserWorkItem(delegate

                {

                    for (int i = 0; i <= 100 && Application.Current != null; i++)

                    {

                        Application.Current.Dispatcher.BeginInvoke((Action)delegate

                        {

     

                            Employee temp = new Employee();

                            temp.name = "aaa" + i.ToString();

                            _employees.Add(temp);

                            lst.SelectedItem = temp;

                            lst.ScrollIntoView(temp);

                        });

                        Thread.Sleep(100);

                    }

     

                });

    用多线程处理能实现想要的效果;

     

    请问大侠,如果是Treeview这样的控件,需要用递归算法的这个多线程要如何修改?

    2011年12月14日 7:55
  • 大侠们,帮我看看这段递归的代码怎么修改?这段代码在数据添加的时候很乱;不是按照顺序来显示;会看到滚动条一直上下来回乱跳;
            /// <summary>
            /// 获取文件夹中所有文件
            /// </summary>
            /// <param name="categoryInfo">树形结构类</param>
            /// <param name="folderFile">所有文件</param>
    public void GetAllFile(CategoryTreeInfo categoryInfo, List<string> folderFile)
            {
                Thread t = new Thread((ThreadStart)delegate
                {
                    foreach (string item in folderFile)
                    {
                        System.Windows.Application.Current.Dispatcher.Invoke(Action)delegate
                        {
                            //返回指定路径字符串的文件名和扩展名
                            string curr_filename = Path.GetFileName(item);
                            //创建新的数据结构类
                            CategoryTreeInfo subCategoryTreeInfo = new CategoryTreeInfo(curr_filename);
                            //添加到树形结构数据类里面
                            categoryInfo.SubCategories.Add(subCategoryTreeInfo);
                            //当前选中
                            DocumentTreeWindow.CategoryTree.SelectedItem = subCategoryTreeInfo;
                            if (!curr_filename.Contains(".") && Directory.Exists(item))
                            {
                                //获取文件夹中所有文件
                                List<string> temp = new List<string>();
                                string[] myFoldersFiles = Directory.GetFileSystemEntries(item);
                                temp.AddRange(myFoldersFiles);
                                m_isLock = true;
                                this.GetAllFile(subCategoryTreeInfo, temp);
                            }
                        });
                        Thread.Sleep(1000);
                    }
                });
                t.Start();
     }

    2011年12月14日 8:21
  • 大侠们,帮我看看。。。
    2011年12月15日 0:17
  • 大侠们呢。。。。。在线等啊。。。
    2011年12月15日 7:05
  • 你好 xxyxxb2080,

    看了你的代码, 我怀疑是因为你的代码中间有一句设置selectedItem的语句,因为treeview是递归的,所以有可能是选中不同子节点的叶子节点时,导致滚动条乱动的情况。

    我需要有关你代码的更详细的信息,麻烦你提供更多的源码,如果能上传一个可以重现你问题的项目的话最好。

    谢谢。


    Annabella Luo[MSFT]
    MSDN Community Support | Feedback to us
    2011年12月15日 9:11
    版主
  • 你好Annabella Luo;非常感谢你的回答

    问题的原因是不应该把递归函数写在System.Windows.Application.Current.Dispatcher.Invoke(Action)delegate

                        {
                            
                        });

    • 已标记为答案 xxyxxb2080 2011年12月16日 0:48
    2011年12月15日 9:36
  • 谢谢你的分享,你可以把你的回复标记成答案。


    Annabella Luo[MSFT]
    MSDN Community Support | Feedback to us
    2011年12月15日 9:41
    版主