use*_*132 6 .net c# wpf ado.net binding
基础知识:我有一个带有ListView的窗口,它由我的网格的datacontext填充:
mainGrid.SetBinding(Grid.DataContextProperty,
new Binding() {
Source = new DataView()
{ Table = SQLHandler.GetHandler[classType.ToString()] }
}
);
Run Code Online (Sandbox Code Playgroud)
在xaml中:
<ListView Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" ItemsSource="{Binding}">
Run Code Online (Sandbox Code Playgroud)
一切正常,它已经填充.正如您在上面所看到的,我有一个可以被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");
}
}
Run Code Online (Sandbox Code Playgroud)
其中GetDataSet是:
public DataSet GetDataSet
{
get { return ds; }
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?当我删除不同窗口中的一行并关闭该行时,主窗口的列表视图不会自行更新.我唯一的选择是刷新按钮,然后重新绑定datacontext属性,当然它正在工作,但我的目标是建立一个"实时"更新系统,这就是Binding的用途.
我试过的:SqlExecuter中的GetDataSet:实现了inotifypropertychanged接口,但没有任何改变.我不能在SqlHandler中的索引器上实现inotifypropertychanged,因为它没有setter,我总是只是从代码隐藏中访问表,我的sqldataadapter填充它们(填充方法)
ps:我真的不打算创建一个ObservableCollection,因为90%的代码都应该被重写,当我删除一行时,我清除我的数据集并重新填充它,所以我甚至不希望它注意到每一个改变,就在我重新填充我的数据表时,我的列表视图应该知道它...并刷新自己
您可能需要将绑定模式设置为两种方式:
Mode = BindingMode.TwoWay
Run Code Online (Sandbox Code Playgroud)
由于某些不明显的原因,WPF 默认采用单向绑定。希望有帮助。我不是特别了解情况,但我已经通过简单的数据绑定到 ObservableCollections 看到了这个问题,并且 TwoWay 绑定修复了它。