Not very familiar with WPF binding and did not read your source in depth But I am very familiar with binding in WinForms. The key to binding in WinForms is that each property of your object should raise the PropertyChanged event when the value changes. This tells bound controls to update. So a typical property will look like this:
public string P1 { get { return p1;} set { if (value == p1) return; p1 = value; OnPropertyChanged("P1"); } } The binding to the control will know that it is bound to the P1 property and update if it receives the PropertyChanged("P1") event. What is probably happening is that the DataTable columns are not raising the event correctly when they are updated. Not sure if DataColumn even raises the event. Likely not. Try to stay clear of DataTables. They are a huge hassle to use. Rather use strongly-type objects out of your data access layer. Louis -----Original Message----- From: Kevin Donn [mailto:kd...@msedd.com] Sent: 02 September 2015 10:35 PM To: firebird-net-provider@lists.sourceforge.net Subject: [Firebird-net-provider] WPF/FB Client interaction issue I've stumbled on either the depth of my own ignorance or a fairly serious problem when using the Firebird .NET Client in a WPF app. It seems there's something wrong with the columns that get built during FbDataAdapter.Fill(DataTable). The columns do not seem to support data binding properly. Specifically, UI elements don't get updated when values in the column change. The example code I've provided demonstrates that columns created prior to Fill and columns created after Fill both work as expected, but columns created during Fill do not. The example also shows that if you fill the DataTable from a SQL Server source with everything else kept the same, columns created during Fill work as expected. To run the project you'll need to provide some connection string info and modify the query to return a few rows of string data with a field named LastName. You may also need to drop in a reference to the Firebird Client assembly which I removed so as not to send any binaries. When the interface comes up, alter any value in the third column and tab away. The expectation is that the value in the fourth column will reflect the change, but for me it doesn't. I'm running against a 2.1.4 server. If you alter the value in either the first or second column and tab away, the other column is updated. The example project source can be downloaded here: https://msedd.com/LinkClick.aspx?fileticket=EcRAVG14WA8%3d&portalid=0 I've pasted in the relevant parts below. The MainWindow XAML: <Window x:Class="FirebirdWPFBug.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <ItemsControl ItemsSource="{Binding COEStudents}"> <ItemsControl.ItemTemplate> <DataTemplate> <Grid> <Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/><ColumnDefinit ion/><ColumnDefinition/></Grid.ColumnDefinitions> <TextBox Text="{Binding [Foo]}" Grid.Column="0"/> <TextBox Text="{Binding [Foo]}" Grid.Column="1"/> <TextBox Text="{Binding [LastName]}" Grid.Column="2"/> <TextBox Text="{Binding [LastName]}" Grid.Column="3"/> </Grid> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </Grid> </Window> The MainWindow code behind: namespace FirebirdWPFBug { public partial class MainWindow: Window { public MainWindow() { InitializeComponent(); DataContext=new COEVM(); } } public class COEVM { DataTable coeStudTable; public DataView COEStudents { get { return coeStudTable.DefaultView; } } public COEVM() { coeStudTable=new DataTable(); // The test is simply to run the project, change a value in the third column, tab away, and // note that the fourth column (which is bound to the same DataColumn) does not update. Making // a change to the first or second column will cause the other to update. // Uncomment these lines to run with SQL Server. You'll need to point to an existing database and // provide a query that produces a few rows of data with a column named LastName. //System.Data.SqlClient.SqlDataAdapter adapter= // new System.Data.SqlClient.SqlDataAdapter( // "select top 3 LastName from HRRM", // @"Data Source=localhost\SQLEXPRESS;Initial Catalog=Viewpoint2;Integrated Security=True"); // In the FbConnection below, you'll need to provide a value for "initial catalog", "user id", and // "password". You'll also need to provide a query that produces a few rows of data with a column // named LastName. // Comment out these lines to use the SQL Server test above. FirebirdSql.Data.FirebirdClient.FbConnection conn=new FirebirdSql.Data.FirebirdClient.FbConnection( @"dialect=3;charset=NONE;connection lifetime=0;connection timeout=15;pooling=True;"+ "packet size=8192;initial catalog=localhost:c:\\Users\\kdonn\\DBs\\NE\\MIS2000.fdb;"+ "server type=Default;user id=userid;password=password"); FirebirdSql.Data.FirebirdClient.FbDataAdapter adapter= new FirebirdSql.Data.FirebirdClient.FbDataAdapter("select first 3 LastName from Student", conn); // Uncomment this line to demonstrate that columns created *before* Fill work as expected. //coeStudTable.Columns.Add("LastName", typeof(string)); adapter.Fill(coeStudTable); // These lines demonstrate that columns created *after* Fill also work as expected. coeStudTable.Columns.Add("Foo", typeof(string)); foreach (DataRow r in coeStudTable.Rows) r["Foo"]=r["LastName"]; // These lines demonstrate that changes are making it from the UI back to the DataColumn, but // notification is not making it back out to the UI. coeStudTable.ColumnChanging+=coeStud_ColumnChanging; coeStudTable.RowChanging+=coeStud_RowChanging; } void coeStud_RowChanging(object sender, DataRowChangeEventArgs e) { System.Diagnostics.Debug.WriteLine("RowChanging"); } void coeStud_ColumnChanging(object sender, DataColumnChangeEventArgs e) { System.Diagnostics.Debug.WriteLine("ColumnChanging"); } } } ---------------------------------------------------------------------------- -- Monitor Your Dynamic Infrastructure at Any Scale With Datadog! Get real-time metrics from all of your servers, apps and tools in one place. SourceForge users - Click here to start your Free Trial of Datadog now! http://pubads.g.doubleclick.net/gampad/clk?id=241902991&iu=/4140 _______________________________________________ Firebird-net-provider mailing list Firebird-net-provider@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/firebird-net-provider ------------------------------------------------------------------------------ Monitor Your Dynamic Infrastructure at Any Scale With Datadog! Get real-time metrics from all of your servers, apps and tools in one place. SourceForge users - Click here to start your Free Trial of Datadog now! http://pubads.g.doubleclick.net/gampad/clk?id=241902991&iu=/4140 _______________________________________________ Firebird-net-provider mailing list Firebird-net-provider@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/firebird-net-provider