C# MVVM在属性B更改时更新属性A
我有一个组合框和DataGrid设置,如下所示:C# MVVM在属性B更改时更新属性A,c#,wpf,mvvm,C#,Wpf,Mvvm,我有一个组合框和DataGrid设置,如下所示: <ComboBox Name="PayrollDatasesListBox" IsReadOnly="True" ItemsSource="{Binding PayrollDatabasesList}" SelectedValue="{Binding SelectedPayrollDatabase}" /> <DataGrid Name="RateTable"
<ComboBox Name="PayrollDatasesListBox"
IsReadOnly="True"
ItemsSource="{Binding PayrollDatabasesList}"
SelectedValue="{Binding SelectedPayrollDatabase}" />
<DataGrid Name="RateTable"
ItemsSource="{Binding RateTableDataView}"
Margin="20"
AutoGenerateColumns="False"
Width="775"> ...
</DataGrid>
...
在ViewModel中,我具有以下属性:
public ObservableCollection<String> PayrollDatabasesList
{
get
{
DelphiaConfigModel _config = (App.Current.Resources["Locator"] as ViewModelLocator).SystemSetupViewModel.DelphiaConfigInfo;
return new ObservableCollection<String>(_config.DatabaseInfo.PayrollDatabaseNames.Split(',')
.Select(c => c.ToString().Trim())
.ToList());
}
}
public String SelectedPayrollDatabase {
get
{
return _SelectedPayrollDatabase;
}
set
{
if (_SelectedPayrollDatabase != value)
{
_SelectedPayrollDatabase = value;
NotifyPropertyChanged(m => m.SelectedPayrollDatabase);
}
}
}
public String _SelectedPayrollDatabase;
public DataView RateTableDataView
{
get
{
DataSet ds = new DataSet("TempDataSet");
// Get reference to DelphiaConfigInfo
DelphiaConfigModel _config =
(App.Current.Resources["Locator"] as ViewModelLocator).SystemSetupViewModel.DelphiaConfigInfo;
using (SQLClass _sql = new SQLClass(_config.DatabaseInfo))
{
using (SqlConnection _conn = _sql.Connection)
{
// use the chosen Payroll Database from ComboBox
//TODO: set InitialCatalog to selected database
SqlConnectionStringBuilder _newConn =
new SqlConnectionStringBuilder(_conn.ConnectionString) { InitialCatalog = SelectedPayrollDatabase };
_conn.ConnectionString = _newConn.ConnectionString;
//_conn.ChangeDatabase("SageHRMS_BKC");
SqlCommand _cmd = _conn.CreateCommand();
_cmd.CommandType = CommandType.StoredProcedure;
_cmd.CommandText = "aem.S_RateTable_SP";
SqlDataAdapter _adapter = new SqlDataAdapter(_cmd);
_adapter.Fill(ds);
}
}
return ds.Tables[0].DefaultView;
}
}
public ObservableCollection工资单数据库列表
{
收到
{
DelphiaConfigModel _config=(App.Current.Resources[“Locator”]作为ViewModelLocator);
返回新的observeCollection(_config.DatabaseInfo.PayrollDatabaseNames.Split(','))
.Select(c=>c.ToString().Trim())
.ToList());
}
}
公共字符串SelectedPayroll数据库{
收到
{
返回_selectedPayroll数据库;
}
设置
{
if(_SelectedPayrollDatabase!=值)
{
_SelectedPayrollDatabase=值;
NotifyPropertyChanged(m=>m.SelectedPayrollDatabase);
}
}
}
公共字符串\u选择Payroll数据库;
公共数据视图费率表数据视图
{
收到
{
数据集ds=新数据集(“临时数据集”);
//获取对DelphiaConfigInfo的引用
DelphiaConfigModel _配置=
(App.Current.Resources[“Locator”]作为ViewModelLocator);
使用(SQLClass _sql=newsqlclass(_config.DatabaseInfo))
{
使用(SqlConnection\u conn=\u sql.Connection)
{
//使用从组合框中选择的工资单数据库
//TODO:将InitialCatalog设置为所选数据库
SqlConnectionStringBuilder\u newConn=
新的SqlConnectionStringBuilder(_conn.ConnectionString){InitialCatalog=SelectedPayrollDatabase};
_conn.ConnectionString=\u newConn.ConnectionString;
//_conn.ChangeDatabase(“SageHRMS_BKC”);
SqlCommand _cmd=_conn.CreateCommand();
_cmd.CommandType=CommandType.storedProcess;
_cmd.CommandText=“aem.S_RateTable_SP”;
SqlDataAdapter _adapter=新的SqlDataAdapter(_cmd);
_适配器。填充(ds);
}
}
返回ds.Tables[0].DefaultView;
}
}
当SelectedPayroll数据库更改时,如何更新RateTableDataView 我可能遗漏了一些内容,但您可以从setter中为所选工资数据库进行更新 或者只需从INotifyPropertyChanged调用PropertyChanged事件并传递属性名 类似于
NotifyPropertyChanged(m => m.RateTableDataView);
我不太明白你的意思,你能举个例子吗?我会在SelectedPayroll数据库设置程序中调用什么来启动RateTableDataView获取程序?这就是为什么我说我可能遗漏了什么,您是否希望在UI中更新绑定?我已经编辑了答案,以显示您可以在“selected”属性中设置的通知,从而导致UI获取。老实说,您不应该将SQL查询之类的内容放入可绑定属性中,它会锁定UI。最好实现一个异步命令,该命令将使用
DataView