WPF& Linq to Entities:如何动态显示其他用户更改的数据?

时间:2010-02-05 07:32:08

标签: wpf database dynamic

提前为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动态更新?

提前致谢, 丹尼尔

1 个答案:

答案 0 :(得分:1)

这是在双层应用程序中直接访问数据库的缺点。

一个原始解决方案是轮询数据库以进行更改。我不确定EF语法,但可能有一些方法可以“刷新”查询。

SQL服务器有一些工具可以通知您有关更改的信息,但实际上构建与数据库紧密耦合的后端可能不是一个好主意。

如果您添加了第三层,当有人对数据进行更改(在将数据发送到数据库之前)时,很容易拦截,此时您无法将更改的副本发送给所有客户端。在这种架构中,通常最好将db视为中间层背后的“哑”持久性机制(所有聪明的东西都会发生)。

至于实际的实施细节,我希望我能说有好消息。一旦开始考虑并发性,大多数这些解决方案都会很快变得非常困难。