簡體   English   中英

WPF中的數據綁定問題

[英]Issue with Data Binding in wpf

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

我在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”的實體類。 然后,將文本框“ textBox1”綁定到“ myEmp”對象的“ empno”屬性。 (我希望到目前為止,所有內容對讀者來說都是清楚的)。 窗體上還有4個文本框,這些文本框綁定到Emp的其他4個屬性。

我在主窗口上定義了一個按鈕(content =“ Find”,目的是在emp表中查找在texbox1中具有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”]為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.

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

您創建了太多的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;
    ...
}

並確保

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

您可能還需要替換foreach (Emp rec in empQuery)循環,方法是

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM