我正在尝试WPF中的数据绑定
我有一个绑定到mysql视图的数据网格,它将是只读的,但我希望它在数据库发生更改时自动刷新。
在google上找不到任何有用的东西,我也不知道从哪里开始。
这是dataprovider类。
class ConDataProvider
{
private MySqlDataAdapter adapter;
private Data data;
private DataTable table;
public ConDataProvider(string query)
{
data = new Data();
table = new DataTable("con_FullGrid");
adapter = data.getAdapter(query);
adapter.Fill(table);
}
public DataView GetDView()
{
dv = new DataView();
dv.Table = table;
return dv;
}
}和窗口的XAML
<Window x:Class="HelioWPF_Alpha01.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:local="clr-namespace:HelioWPF_Alpha01"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="676" Width="924" MinHeight="300" MinWidth="463" Background="{x:Null}">
<Window.Resources>
<ObjectDataProvider x:Key="ConDataProvider" ObjectType="{x:Type local:ConDataProvider}">
<ObjectDataProvider.ConstructorParameters>
<sys:String>SELECT * FROM con_FullGrid</sys:String>
</ObjectDataProvider.ConstructorParameters>
</ObjectDataProvider>
<ObjectDataProvider x:Key="btable" ObjectInstance="{StaticResource ConDataProvider}"
MethodName="GetDView"/>
</Window.Resources>
<Grid Name="mainGrid" DataContext="{Binding Source={StaticResource btable}" KeyDown="mainGrid_KeyDown" FlowDirection="LeftToRight" >
<DataGrid AutoGenerateColumns="True" ItemsSource="{Binding}" Name="dataGrid1" FrozenColumnCount="20" RowHeight="25" Grid.ColumnSpan="4" ColumnWidth="*" MouseDoubleClick="dataGrid1_MouseDoubleClick" SelectionMode="Single" Grid.Row="2" Grid.Column="1" TabIndex="1" GotKeyboardFocus="dataGrid1_GotKeyboardFocus">
<DataGrid.AlternatingRowBackground>
<LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">
<GradientStop Color="Black" Offset="0" />
<GradientStop Color="#16436DF8" Offset="0" />
</LinearGradientBrush>
</DataGrid.AlternatingRowBackground></DataGrid>
</Grid>
我一直在做的是通过在后台代码中重新初始化ConDataProvider类并在各种事件上重新绑定datagrid来伪造它。但这是一个丑陋的黑客。
如果有必要的话,我不介意重新设计整个东西。
数据类只包含连接字符串和一些与数据库交互的方法。你可以在这里看到:http://pastebin.com/m9HLfwEQ
提前谢谢。
希望能得到一些好的建议。
发布于 2011-03-14 02:42:25
不如你给一些Reactive Extensions接上线。
您可以做的是创建一个每X秒轮询一次数据库的可观察对象。然后让你的观察者连接到那个观察者。在观察者的OnNext事件中,您可以将数据添加到您的网格中,或者重新绑定,等等。
从本质上讲,你会在你的数据库和你的应用程序之间创建一些东西,来监听变化并将这些变化推送给你。
发布于 2011-03-14 16:18:57
每当数据库中的数据发生更改时,MySQL都会在日志中追加信息。此功能可能必须打开,不确定它是否默认打开。
http://dev.mysql.com/doc/refman/5.0/en/binary-log.html
这样,您就可以在服务器端运行一个服务,该服务将侦听MySQL表的更改,并在表更新时向客户端发送事件。
客户端需要实现用于在从服务器接收到此类事件时刷新网格的代码。
要扫描bin日志中的更改,可以使用bin-log实用程序。
http://dev.mysql.com/doc/refman/5.0/en/mysqlbinlog.html
如果数据量或事务量很大,我会使用这种方法,而不是扫描表中的数据更改。否则,轮询DB的方法应该工作得很好。
https://stackoverflow.com/questions/5290663
复制相似问题