【发布时间】:2014-11-23 14:57:05
【问题描述】:
我认为Datagrid 绑定到ObservableCollection<T>。该集合是从使用 Linq to EF 方法在 viewmodel 构造函数中调用的方法填充的。从我的 SQL Server 数据库中的视图中选择记录:
属性:
private ObservableCollection<vwAccountHeader> _accountHeaderCollection;
public ObservableCollection<vwAccountHeader> AccountHeaderCollection
{
get { return _accountHeaderCollection; }
set
{
_accountHeaderCollection = value;
OnPropertyChanged("AccountHeaderCollection");
}
}
方法:
private void GetAccountHeaders()
{
var query = from a in _context.vwAccountHeaders
select a;
AccountHeaderCollection = new ObservableCollection<vwAccountHeader>(query);
}
所选项目:
private vwAccountHeader _selectedAccountHeader;
public vwAccountHeader SelectedAccountHeader
{
get { return _selectedAccountHeader; }
set
{
_selectedAccountHeader = value;
OnPropertyChanged("SelectedAccountHeader");
}
}
集合在初始化时按预期填充。然后,我可以让用户从 Datagrid 中选择一行并编辑该行:
所选项目的更改被持久化回一个 sql 表,而不是绑定到 DataGrid 的 sql 视图,但是该表是视图的父级,因此更改也会持久化到视图。例如这里是我的SaveEdits 命令:
private void SaveAccountEditsCommandAction()
{
var query = from a in _context.tbAccounts
where SelectedAccount.accountId == a.accountId
select a;
foreach (var a in query)
{
a.Div1AccNo = SelectedAccount.Div1AccNo;
a.AccountName = SelectedAccount.AccountName;
a.CompanyName = SelectedAccount.CompanyName;
a.ContactEmail = SelectedAccount.ContactEmail;
a.ContactName = SelectedAccount.ContactName;
a.SubscriptionLevel = SelectedAccount.SubscriptionLevel;
a.Responsible = SelectedAccount.Responsible;
a.notes = SelectedAccount.notes;
a.IsActive = SelectedAccount.IsActive;
}
_context.SaveChanges();
}
这些更改保留在我的 SQL Server 中的VWAccountHeaders 视图中。我正在实现INotifyPropertyChnaged,并且 Xaml 绑定设置为在“PropertyChanged”上更新:
<DataGrid x:Name="AccountsHeaderDataGrid" Margin="10" ItemsSource="{Binding AccountHeaderCollection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" AutoGenerateColumns="False" SelectedItem="{Binding SelectedAccountHeader, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
IsReadOnly="True" CanUserAddRows="False" SelectionMode="Single" VerticalScrollBarVisibility="Auto" Height="350">
<DataGrid.Columns>
<DataGridTextColumn Header="Account No" Binding="{Binding Path=div1accno, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="SizeToHeader"/>
<DataGridTextColumn Header="Company Name" Binding="{Binding Path=companyname, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="SizeToHeader"/>
<DataGridTextColumn Header="Subscription Level" Binding="{Binding Path=subscriptionlevel, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="SizeToHeader"/>
<DataGridTextColumn Header="Region List" Binding="{Binding Path=region_list, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="SizeToHeader"/>
<DataGridCheckBoxColumn Header="Is Active" Binding="{Binding Path=IsActive, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="SizeToHeader"/>
</DataGrid.Columns>
<DataGrid/>
尽管如此,如果不关闭应用程序并重新运行,我就无法让 UI 反映基础数据的变化。我可以看到DataGrid 在保存时闪烁,因此可以看到它正在重新绑定,但它只是没有获取基础视图中的更改。我是否需要以某种方式刷新我的数据上下文,还是我在这里遗漏了一些简单的东西?
【问题讨论】: