WPF使用BindingList/ObservableCollection实现数据绑定同步刷新

  想必这个问题做过WPF开发的程序员几乎都遇到吧?自从注册了博客园五个月以来,一直都是扮演的浏览者角色。我觉得技术人员应该具有爱分享的品质,同时写博文也是对自己技术的一种锤炼,所以开始总结一些遇到的问题,希望对一些遇到同样难题困扰的朋友们有些帮助或者是启示。这是我发表在博客园的第一篇博文,疏忽纰漏支出还希望大家给予指出。

<Window x:Class="数据绑定同步刷新.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded_1">
    <Grid>
        <ListBox Background="Transparent" ItemsSource="{Binding}" 
                                             Name="lbxMarineFiles" Margin="0,0,179,145">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Border Margin="5,0">
                        <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
                            <Ellipse Stroke="#C1C1C1"
                                                             StrokeThickness="1" 
                                                             Width="6" 
                                                             VerticalAlignment="Center"
                                                             Height="6" 
                                                             Fill="#DDFF82"/>
                            <TextBlock Text="{Binding Note}"
                                                       VerticalAlignment="Center"/>
                        </StackPanel>
                    </Border>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <Button Content="Button" HorizontalAlignment="Left" Margin="418,80,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/>
        <ListBox HorizontalAlignment="Right" Height="140" Margin="0,180,179,0" ItemsSource="{Binding}" 
                                             Name="lbxBindList"
                 VerticalAlignment="Top" Width="338">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Border Margin="5,0">
                        <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
                            <Ellipse Stroke="#C1C1C1"
                                                             StrokeThickness="1" 
                                                             Width="6" 
                                                             VerticalAlignment="Center"
                                                             Height="6" 
                                                             Fill="#DDFF82"/>
                            <TextBlock Text="{Binding Note}"
                                                       VerticalAlignment="Center"/>
                        </StackPanel>
                    </Border>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;
using System.Collections.ObjectModel;

namespace 数据绑定同步刷新
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        ObservableCollection<Notes> liData = new ObservableCollection<Notes>();
        BindingList<Notes> biData = new BindingList<Notes>();
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded_1(object sender, RoutedEventArgs e)
        {
            liData.Add(new Notes("id"));
            biData.Add(new Notes("hi"));
            this.lbxMarineFiles.ItemsSource = liData;
            this.lbxBindList.ItemsSource = biData;
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            liData.Add(new Notes("id1"));
            biData.Add(new Notes("hi1"));
        }
    }

    public class Notes
    {
        private string note;

        public string Note
        {
            get { return note; }
            set { note = value; }
        }

        public Notes(String filed)
        {
            this.note = filed;
        }          
    }
}

总结:使用BindingList或者ObservableCollection作为数据源时,只需要与Control绑定一次就够了。数据源改变后,界面会同步刷新显示最新数据。原因是它们两个实现了INotifyCollectionChanged接口,具有了本身状态改变时通知客户端的能力。

posted @ 2016-10-04 16:53  天涯海角路  阅读(2677)  评论(0)    收藏  举报