提前为noob问题道歉,我只使用WPF几周和SQL Server几天,但到目前为止我无法在网上找到如何做到这一点。
我在SQL Server上有一个数据库,其中有一个表'User',并且有一个应用程序可以使用Bindings在ListView中显示来自该表的数据(用户名)。
但是,如果数据库通过应用程序以外的其他内容添加/删除了项目,则更改不会自动反映在ListView中。我认为Bindings会处理这个问题,但也许只有当应用程序本身修改数据时才会这样做?
XAML:
<Window.Resources>
<DataTemplate x:Key="ShowUser" DataType="{x:Type db:User}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Username}" />
</StackPanel>
</DataTemplate>
</Window.Resources>
...
<ListView Grid.Row="2" x:Name="TheListView" ItemTemplate="{StaticResource ShowUser}">
代码背后:
public MainWindow()
{
InitializeComponent();
MyDBEntities db = new MyDBEntities();
var users = from u in db.Users
select u;
IListSource query = (IListSource)users;
TheListView.ItemsSource = query.GetList();
}
当数据库内容被应用程序本身以外的其他内容更改时,我需要做什么才能使ListView动态更新?
提前致谢, 丹尼尔
答案 0 :(得分:1)
这是在双层应用程序中直接访问数据库的缺点。
一个原始解决方案是轮询数据库以进行更改。我不确定EF语法,但可能有一些方法可以“刷新”查询。
SQL服务器有一些工具可以通知您有关更改的信息,但实际上构建与数据库紧密耦合的后端可能不是一个好主意。
如果您添加了第三层,当有人对数据进行更改(在将数据发送到数据库之前)时,很容易拦截,此时您无法将更改的副本发送给所有客户端。在这种架构中,通常最好将db视为中间层背后的“哑”持久性机制(所有聪明的东西都会发生)。
至于实际的实施细节,我希望我能说有好消息。一旦开始考虑并发性,大多数这些解决方案都会很快变得非常困难。