ListView与DataTable绑定,删除行后不更新

时间:2012-12-26 15:54:46

标签: c# .net wpf binding ado.net

基础知识:我有一个带有ListView的窗口,它由我的网格的datacontext填充:

mainGrid.SetBinding(Grid.DataContextProperty, 
    new Binding() { 
        Source = new DataView() 
            { Table = SQLHandler.GetHandler[classType.ToString()] } 
    }
);
xaml中的

<ListView Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" ItemsSource="{Binding}">

一切正常,它已经填充。如上所示,我有一个可由Singleton访问的SQLHandler类,我可以使用索引器访问我的表。

问题:窗口加载,我选择一行,单击编辑按钮,新窗口加载,我获取所选行的详细信息。当我通过这个新窗口删除此行并关闭它时,主窗口(显示完整数据表的位置)不会相应更新。我知道解决方案应该是什么,但我不能让它发挥作用。 (inotifyproperty将接口更改为SqlHandler类,Binding.IndexerName等。)

这是主要的事情:数据集不在我的SqlHandler类中,它在SqlExecuter中,我的所有sql命令都在这里执行。

public override DataTable this[string key]
{
    get
    {
        if (sqlExecuter.GetDataSet.Tables.Contains(key)) 
            return sqlExecuter.GetDataSet.Tables[key];
        throw new KeyNotFoundException("The specified key was not found");
    }
}

其中GetDataSet是:

public DataSet GetDataSet
{
    get { return ds; }
}

我该如何使这项工作?当我删除不同窗口中的一行并关闭该行时,主窗口的列表视图不会自行更新。 我唯一的选择是刷新按钮,然后重新绑定datacontext属性,当然它正在工作,但我的目标是建立一个“实时”更新系统,这毕竟是Binding的用途。

我尝试过:SqlExecuter中的GetDataSet:实现了inotifypropertychanged接口,但没有任何改变。我不能在SqlHandler中的索引器上实现inotifypropertychanged,因为它没有setter,我总是只是从代码隐藏中访问表,我的sqldataadapter正在填充它们(填充方法)

ps:我真的不打算创建一个ObservableCollection,因为90%的代码都应该被重写,当我删除一行时,我清除了我的数据集并再次填充它,所以我甚至没想到它注意每一个变化,就在我重新填充我的数据表时,我的列表视图应该知道它并刷新自己

2 个答案:

答案 0 :(得分:1)

我认为使用第二个窗口作为弹出窗口可能是问题所在。如果您在同一页面上进行编辑,那么您可以使用简单的

ListView1.DataBind()

刷新delete命令末尾的列表内容。或者,如果页面重新绘制而不是重新加载,则可以使用IsPostBack方法更新列表。

您可以尝试从其他窗口调用页面名称然后调用列表视图,但我不确定您是否可以从其他窗口执行该类命令。

或者,您可以在不同的页面上进行编辑,而不是单独的窗口,因此当您返回原始页面时,正在重新绘制列表视图。

就像你自己一样,我确信你的问题有一个更简单的解决方案,但不幸的是我不知道。

答案 1 :(得分:0)

您可能需要将绑定模式设置为两种方式:

Mode = BindingMode.TwoWay

WPF出于一些非显而易见的原因,默认为单向绑定。希望有所帮助。我并不是特别了解情况,但我已经看到了这个问题,简单的数据绑定到ObservableCollections,而TwoWay绑定修复了它。