我有一个DataGrid
和两个按钮。按下第一个按钮将调用一个命令,该命令使用DataTable
从数据库表填充我的DataGrid。第二个按钮将应用一些逻辑,并最终从数据库表中删除数据。我的问题是,选择第二个按钮后,DataGrid不会更新,仍然显示数据库中不再存在的行。这是我的设置:
Button1(填充数据网格):
<Button Content="Load Data" Command="{Binding FillMyDataTableCommand}"/>
DataGrid:
<DataGrid ItemsSource="{Binding MyDataTable}">
Button2(应用逻辑,数据不再在表中):
<Button Command="{Binding StartCommand}" CommandParameter="{Binding ElementName=myDataGrid}"</Button>
在选择button2时,我的ViewModel会处理逻辑,在逻辑之后,我想更新数据网格以显示对表的更改:
myDataGrid.Items.Refresh();
我无法在ViewModel中执行此操作,因为那样会违反MVVM,因为它对视图一无所知。我尝试了一种变通方法,方法是使用单击命令将按钮的代码添加到后面的代码中,希望它在绑定命令之后执行。但是它首先执行:
Button2(尝试):
<Button Command="{Binding StartCommand}" CommandParameter="{Binding ElementName=myDataGrid}" click="button_click_Refresh"</Button>
我该如何解决?
答案 0 :(得分:0)
我也记得有这个问题。
我想出了两种对我有用的解决方案:
将我的DataGrid的ItemSource的数据类型更改为ObservableCollection,当集合更改时,它会更新UI。
在需要更改数据时覆盖我的ItemSource。例如,当我想从数据库中检索不同的数据时,将一个新的DataTable分配为ItemSource。
答案 1 :(得分:0)
定义了select
replace(q'[case when decode(max(${column_name}),min(${column_name}),1,0) = 0 then '${column_name} ' end ||]',
'${column_name}',
column_name) as dif_col_names
from user_tab_columns where table_name = 'TRANS'
order by column_id;
DIF_COL_NAMES
------------------------------------------------------------------
case when decode(max(COL1),min(COL1),1,0) = 0 then 'COL1 ' end ||
case when decode(max(COL2),min(COL2),1,0) = 0 then 'COL2 ' end ||
case when decode(max(COL3),min(COL3),1,0) = 0 then 'COL3 ' end ||
case when decode(max(COL4),min(COL4),1,0) = 0 then 'COL4 ' end ||
属性的视图模型应该实现viewBox接口。
然后,您可以修改MyDataTable
中的DataView
并引发视图模型中DataTable
属性的PropertyChanged
事件,以刷新MyDataTable
视图:
DataGrid