WPF Combobox DataBound到DataTable,自动刷新

时间:2011-02-24 05:34:58

标签: c# wpf data-binding

我有一个comboboxdatabindingDataTable,它从数据库中获取数据,如下所示:

SqlDataAdapter adp = new SqlDataAdapter
    (@"SELECT [CategoryID],[CategoryName]FROM [Northwind].[dbo].[Categories]", 
     @"Integrated Security=SSPI;Initial Catalog=Northwind;Data Source=AKSHAY-PC\SQLEXPRESS");

DataTable tbl = new DataTable();
adp.Fill(tbl);

cmbCities.ItemsSource = ((IListSource)tbl).GetList();

cmbCities.DisplayMemberPath = "[CategoryName]";
cmbCities.SelectedValuePath = "[CategoryID]";

当表数据发生更改(添加/删除行)时,combobox不会刷新,因为IList没有构建更改通知。

有什么办法可以实现吗?

如果不可能,有没有办法“刷新”数据绑定,以便datatable再次获取数据。在这种情况下,我将要做的是在初始化窗口时执行上面的代码,然后再次刷新它,而无需再次执行相同的代码。类似于cmbCities.Data.Refresh()

3 个答案:

答案 0 :(得分:1)

在从数据库中获取数据后,使用ObservableCollection存储数据怎么样?

http://wpflog.blogspot.com/2009/04/very-simple-observablecollection.html

答案 1 :(得分:0)

我有类似的情况检查这个问题:WPF live Update from database

如果您的要求只是刷新Data Binding,请查看ObservableCollection

答案 2 :(得分:0)

当您单击相应的按钮时,代码将清除并填充sql适配器中的组合框。

XAML:

<Window x:Class="TestApp.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">

    <StackPanel>
        <ComboBox Name="cmbCities" />
        <Button Content="Clear" Click="OnClear"/>
        <Button Content="Fill" Click="OnFill"/>
    </StackPanel>

</Window>

代码背后:

using System;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Windows;

namespace TestApp
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            _adp.Fill(_tbl);

            cmbCities.ItemsSource = ((IListSource)_tbl).GetList();

            cmbCities.DisplayMemberPath = "[CategoryName]";
            cmbCities.SelectedValuePath = "[CategoryID]";

            DataContext = this;
        }

        private void OnClear(object sender, RoutedEventArgs e)
        {
            _tbl.Clear();
        }

        private void OnFill(object sender, RoutedEventArgs e)
        {
            _adp.Fill(_tbl);
        }

        private DataTable _tbl = new DataTable();
        private SqlDataAdapter _adp = new SqlDataAdapter(@"SELECT [CategoryID],[CategoryName]FROM [Northwind].[dbo].[Categories]", @"Integrated Security=SSPI;Initial Catalog=Northwind;Data Source=AKSHAY-PC\SQLEXPRESS");

    }
}