2013-02-18 156 views
0

我有一個名爲「僱員」的對象,如下所示:綁定WPF控件對象

class Employee 
{ 
    public string EmpName { get; set; } 
    public string Surname { get; set; } 

    public Employee(string Name, string Surname) : base() 
    { 
     this.EmpName = EmpName; 
     this.Surname = Surname; 
    } 

    public Employee() 
    { 
    } 
} 

我也有這個簡單的「EmployeeControl」在這裏。在網格中只有兩個標籤:

<UserControl x:Class="LabelBindingTest.EmployeeCtrl" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      Name="EmpCtrl" 
      d:DesignHeight="120" d:DesignWidth="411"> 
    <Grid> 
     <Label Content="{Binding ElementName=EmpCtrl, Path=EmpName}" Height="28" HorizontalAlignment="Left" Name="label1" VerticalAlignment="Top" Width="81" /> 
     <Label Content="{Binding ElementName=EmpCtrl, Path=Surname}" Height="28" HorizontalAlignment="Right" Name="label2" VerticalAlignment="Top" Width="81" /> 
    </Grid> 
</UserControl> 

(編輯)EmployeeControl代碼隱藏:

public partial class EmployeeCtrl : UserControl 
    { 
     Employee thisEmployee = new Employee(); 

     public string EmpName 
     { 
      get 
      { 
       return thisEmployee.EmpName; 
      } 

      set 
      { 
       thisEmployee.EmpName = value; 
      } 
     } 

     public string Surname 
     { 
      get 
      { 
       return thisEmployee.EmpName; 
      } 

      set 
      { 
       thisEmployee.EmpName = value; 
      } 
     } 


     public EmployeeCtrl() 
     { 
      InitializeComponent(); 
     } 
    } 

現在,我想要做的就是添加「EmployeeControl」 s到我的窗口,並結合他們的員工對象。 這裏是我的「窗口」,代碼:

<Window x:Class="LabelBindingTest.MainWindow" 
     Name="myWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" xmlns:my="clr-namespace:LabelBindingTest"> 
    <Grid> 
     <my:EmployeeCtrl EmpName="Daniel" Surname="Hammond" HorizontalAlignment="Left" Margin="23,26,0,0" x:Name="employeeCtrl1" VerticalAlignment="Top" Height="97" Width="429" /> 
    </Grid> 
</Window> 

我已經嘗試了各種東西,但我無法得到它的工作。它編譯得很好,但標籤是空的。我只想將我的「Employee」對象附加到「EmployeeCtrl」控件。關於我如何解決這個問題的任何想法?我今天讀了很多關於綁定的內容,但我仍然在撓頭。我不確定是否需要實施INotifyPropertyChanged,因爲我現在只在運行時設置員工姓名。

(編輯):我已經下載了Caliburn.Micro,並在最後一個答案中使用了相同的代碼。相同的結果,空的窗口。

這是整個項目。雖然它的所有代碼應該粘貼在這個問題中。這只是爲了方便。

http://www.mediafire.com/?gux3573rz64mupe

+0

你可以顯示用戶控制的代碼嗎?\ – AbZy 2013-02-18 23:33:43

+0

你在MainWindow中設置了什麼DataContext? – 2013-02-18 23:37:54

回答

1

好吧,首先,我會強烈建議考慮MVVM爲您的應用程序變得更加複雜,而use an MVVM framework if you're using MVVM。我會推薦Caliburn.Micro這使得您的視圖組合更容易。還有其他MVVM框架可用,因此請評估它們。

對於你的問題,問題是你的用戶控件沒有實現它的屬性作爲依賴屬性。在XAML中,您正在設置用戶控件的EmpNameSurname屬性,但UI在構造用戶控件後並不知道它們的值已更改,因此不會自行更新。

您在使用MVVM模式的視圖模型和用戶控件的dependency properties上實現了INotifyPropetyChanged。這兩種技術都會通知用戶界面更改並強制更新。

因此,對於你的用戶控件,你可以這樣做:

public partial class EmployeeCtrl : UserControl 
{ 
    public static readonly DependencyProperty EmpNameProperty = 
     DependencyProperty.Register("EmpName", typeof(string), 
     typeof(EmployeeCtrl), new FrameworkPropertyMetadata(null)); 

    public static readonly DependencyProperty SurnameProperty = 
     DependencyProperty.Register("Surname", typeof(string), 
     typeof(EmployeeCtrl), new FrameworkPropertyMetadata(null)); 

    public EmployeeCtrl() 
    { 
     this.InitializeComponent(); 
    } 

    public string EmpName 
    { 
     get { return (string)GetValue(EmpNameProperty); } 
     set { SetValue(EmpNameProperty, value); } 
    } 

    public string Surname 
    { 
     get { return (string)GetValue(SurnameProperty); } 
     set { SetValue(SurnameProperty, value); } 
    } 
} 

你實際上並不需要你Employee類都在這個階段,你不使用它,但最好應該落實INotifyPropertyChanged如果是屬性值將在構建後發生變化,並且您有一個實例綁定到UI,並且希望UI被更新。

+0

請參閱編輯。不過,我現在不會在這裏待上幾個小時。 – Harry 2013-02-19 00:18:21

+0

答覆已更新。 – devdigital 2013-02-19 08:01:09

+0

它仍然不起作用。也許在UserControl XAML中綁定有問題? '

0

您需要在EmployeeCtrl的EmpName和Surname屬性上實現INotifyPropertyChanged,因爲此用戶控件中的標籤需要更新此屬性值中的值更改,以便標籤可以更新其值。因此,您必須在EmployeeCtrl的EmpName和Surname屬性上實現通知更改,或者只需對此兩個屬性使用依賴項屬性。希望這可以幫助!!!