2013-11-27 67 views
0

我是C#的新手。我想解決一個數據綁定問題。問題是這樣的:wpf中的數據綁定問題

我爲XAML部分中的文本框定義了一個數據綁定,如下所示;

<Window x:Class="WpfAppl2_DB_Entity.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:l="clr-namespace:WpfAppl2_DB_Entity" 
     Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded"> 
    <Window.Resources> 
     <l:Emp x:Key="myEmp"/> 
    </Window.Resources> 
    <Grid Name="grid1"> 
     <TextBox Height="18" HorizontalAlignment="Left" Margin="229,94,0,0" 
       Name="textBox1" VerticalAlignment="Top" Width="96" > 
      <TextBox.Text> 
       <Binding Source="{StaticResource myEmp}" Path="empno" Mode = "TwoWay"> 
        <Binding.ValidationRules> 
         <ExceptionValidationRule/> 
        </Binding.ValidationRules> 
       </Binding> 
      </TextBox.Text> 
     </TextBox>  
     <!-- more text boxes come here --> 
    </Grid> 
</Window> 

這裏該項目的主要命名空間是「WpfAppl2_DB_Entity」,而我給了前綴「L」,然後我定義了一個靜態資源「myEmp」是「的Emp」類的一個對象,EMP學習班也在同一個項目中並且在相同的命名空間中定義,這是映射到數據庫中的表「emp」的實體類。然後我將TextBox「textBox1」綁定到「myEmp」對象的「empno」屬性。 (我希望讀者到目前爲止一切都清楚)。表單上還有4個文本框,它們綁定到Emp的4個其他屬性。

我在主窗口上定義了一個按鈕(content =「Find」,目的是在emp表中找到emp98中具有empno = value的記錄)。在「查找」按鈕的點擊事件中,我寫了這個:

  emps = amirDB.GetTable<Emp>(); // amirDB is an instance of a class derived from DataContext class 
      Emp qryEmp = new Emp(); 
      qryEmp = this.Resources["myEmp"] as Emp; 
      var empQuery = from o in emps 
          where o.empno == Convert.ToInt32(textBox1.Text) 
         select o; 
      foreach (Emp rec in empQuery) 
      { 
       qryEmp = new Emp(); 
       qryEmp.empno = rec.empno; 
       qryEmp.ename = rec.ename; 
       qryEmp.job = rec.job; 
       qryEmp.sal = rec.sal; 
       qryEmp.deptno = rec.deptno; 
       break; // we want to retrieve at most one record 
      } 

現在,因爲該文本框都綁定到靜態資源「myEmp」的不同性質,我們創建了一個新的Emp對象「qryEmp」,然後分配這個新對象的靜態資源(qryEmp = this.Resources [「myEmp」] as Emp;)。所以,這意味着2個變量引用內存中的同一個對象(對吧?),之後我將檢索到的記錄的不同屬性分配給qryEmp對象的相應屬性。所以qryEmp現在擁有從數據庫中檢索的完整記錄。由於myEmp也指向相同的對象,它也應該有記錄。由於文本框綁定到myEmp對象,我猜測應該更新文本框以顯示完整的記錄數據(所有字段)。但是我發現文本框保持空白(只有第一個文本框的值是通過鍵盤輸入的)。

我的問題是爲什麼文本框不顯示檢索的記錄值?

以另一種方式,我將rec。*字段值直接分配給上述foreach循環中的文本框(textBox2.Text = rec.ename,textBox3 = rec.job,....),在這種情況下,文本框按預期顯示所有值。

I wanted the code to assign front end/back end field values without referring to text boxes, because Microsoft claims that wpf separates the UI from business logic. So, my approach was to just bind all the text boxes to appropriate properties of an object, and then in programming logic, I use only the program objects (myEmp, qryEmp), no UI objects. 

有人可以幫忙嗎?讓我知道我在這裏做錯了什麼?提前致謝。

回答

1

您正在創建太多的Emp實例。

替換

Emp qryEmp = new Emp(); 
qryEmp = this.Resources["myEmp"] as Emp; 

通過

Emp qryEmp = this.Resources["myEmp"] as Emp; 

foreach (Emp rec in empQuery) 
{ 
    qryEmp = new Emp(); 
    qryEmp.empno = rec.empno; 
    ... 
} 

通過

foreach (Emp rec in empQuery) 
{ 
    qryEmp.empno = rec.empno; 
    ... 
} 

和M AKE確保

  • 的Emp實現 INotifyPropertyChanged 接口,
  • empno等。是Emp 類中的公共屬性(非字段),
  • ,並且這些屬性會引發PropertyChanged事件。

您也可能希望通過

Emp rec in empQuery.FirstOrDefault(); 
if (rec != null) 
{ 
    qryEmp.empno = rec.empno; 
    ... 
} 
更換 foreach (Emp rec in empQuery)