绑定命令执行后修改视图

时间:2019-07-15 13:16:32

标签: c# wpf xaml mvvm

我有一个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>

我该如何解决?

2 个答案:

答案 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