重新加载绑定到WPF数据表格的数据表。

3

我希望能够在我的WPF Datagrid中显示一个SQL表格,运行时编写SQL查询语句。 我已经建立了我的视图(简化版)和关联的ViewModel:

视图:

-----------------MyDataGrid.xaml-----------------

<DataGrid x:Name="CurrentSqlGrid" 
          ItemsSource="{Binding Path=CurrentDataTable,Mode=OneWay}"  
          Grid.Row="2" AutoGenerateColumns="True"  IsReadOnly="True" />
<TextBox x:Name="TextBoxSql" Height="120" Grid.Row="1" 
         TextWrapping="Wrap" VerticalAlignment="Top"/>

-----------------MyDataGrid.cs-----------------

public partial class MyDataGrid : UserControl
{
    private SqlDataGridViewModel sqlDataGridViewModel;

    public MyDataGrid()
    {
        InitializeComponent();
        sqlDataGridViewModel = new SqlDataGridViewModel();
        this.DataContext = sqlDataGridViewModel;
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        sqlDataGridViewModel.FillDataTableWithQuery(TextBoxSql.Text);          
    }
}

视图模型:

-----------------SqlDataGridViewModel.cs-----------------

public class SqlDataGridViewModel 
{
    private DataTable _dataTable;
    private SqlDataAdapter _adapter;

    public DataTable CurrentDataTable
    {
        get
        {
            return _dataTable;
        }
        set
        {
            _dataTable = value;
        }
    }

    public SqlDataGridViewModel()
    {
        _dataTable = new DataTable("QUERY");
        FillDataTableWithQuery("SELECT TOP 500 * FROM XUSER");           
    }

    public void FillDataTableWithQuery(string query)
    {
        CurrentDataTable.Reset();
        CurrentDataTable.Clear();

        try
        {
            using (SqlConnection sqlConn = new SqlConnection(SessionProvider.Instance.currentConnectionString))
            {
                _adapter = new SqlDataAdapter(query, sqlConn);
                _adapter.Fill(CurrentDataTable);
            }
        }
        catch (Exception ex)
        {
            MartuLogger.Instance.Error("Exception in SqlDataGridViewModel :" + ex.Message);
        }
    }
}

这个解决方案显示了第一个查询的第一个数据表。但是当我编写另一个SQL查询时,我调用FillDataTableWithQuery("SELECT * from another_table")并且Datagrid清除了所有行,但它不会加载新列和新行!(仅显示旧列!)。在调试中,CurrentDataTable包含新查询的结果.... 任何想法? 解决方案 在Faisal Hafeez的帮助下,我们找到了这个解决方案:
Xaml和代码后端是相同的。 它可以使用OneWay和TwoWay模式。
我的视图模型变成:
public class SqlDataGridViewModel : INotifyPropertyChanged
{
    private DataTable _dataTable;
    private SqlDataAdapter _adapter;
    public event PropertyChangedEventHandler PropertyChanged;

    protected void NotifyPropertyChange(string PropertyName)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
    }

    public DataTable CurrentDataTable
    {
        get
        {
            return _dataTable;
        }
        set
        {
            _dataTable = value;
            //NotifyPropertyChange("CurrentDataTable");
        }
    }

    public SqlDataGridViewModel()
    {
        _dataTable = new DataTable("QUERY");
        FillDataTableWithQuery("SELECT TOP 500 * FROM XUSER");           
    }

    public void FillDataTableWithQuery(string query)
    {
        _dataTable = new DataTable("QUERY");

        try
        {
            using (SqlConnection sqlConn = new SqlConnection(SessionProvider.Instance.currentConnectionString))
            {
                _adapter = new SqlDataAdapter(query, sqlConn);
                _adapter.Fill(CurrentDataTable);
            }

            NotifyPropertyChange("CurrentDataTable");
        }
        catch (Exception ex)
        {
            MartuLogger.Instance.Error("Exception in SqlDataGridViewModel :" + ex.Message);
        }
    }
}

如果我在_adapter.Fill之后不通知NotifyPropertyChange,则视图不会刷新。(我已尝试在Set CurrentTable中通知,但_adapter.Fill显然不调用CurrentTable的set方法)。 谢谢。

你需要告诉你的视图表已经被更新了。你的视图模型需要实现NotifyOfPropertyChanged。 - fhnaseer
我已经尝试使用INotifyPropertyChanged,但没有任何效果。 - davymartu
1个回答

1
尝试这个。您需要实现INotifyPropertyChanged并在datagrid的set事件上调用PropertyChanged。
公共类SqlDataGridViewModel :INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;

public void OnPropertyChanged(String info)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(info));
    }
}

public DataTable CurrentDataTable
    {
        get
        {
            return _dataTable;
        }
        set
        {
            _dataTable = value;
            OnPropertyChanged("CurrentDataTable");
        }
    }
}

我尝试了你的解决方案,但是NotifyChanged不是问题...我认为这是AutoGeneratingColumns属性的问题! - davymartu
1
我想我已经找出问题所在了。在你的视图中,你设置了Mode=OneWay。将其改为TwoWay。我认为这样会起作用。 - fhnaseer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接