2010-04-01 70 views
1

爲了討論的方便,這裏有一個簡單的人類我如何可以綁定到一個輔助屬性在Silverlight

public class Person : DependencyObject, INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public static readonly DependencyProperty FirstNameProperty = 
     DependencyProperty.Register("FirstName", 
            typeof (string), 
            typeof (Person), 
            null); 
    public static readonly DependencyProperty LastNameProperty = 
     DependencyProperty.Register("LastName", 
            typeof(string), 
            typeof(Person), 
            null); 

    public string FirstName 
    { 
     get 
     { 
      return (string) GetValue(FirstNameProperty); 
     } 
     set 
     { 
      SetValue(FirstNameProperty, value); 
      if(PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("FirstName")); 
     } 
    } 

    public string LastName 
    { 
     get 
     { 
      return (string) GetValue(LastNameProperty); 
     } 
     set 
     { 
      SetValue(LastNameProperty, value); 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("LastName")); 
     } 
    } 
} 

我希望去建立一個只讀屬性,這樣

public string FullName 
    { 
     get { return FirstName + " " + LastName; } 
    } 

如何在這種情況下綁定工作?我試着添加一個DependancyProperty併爲全名引發PropertyChanged事件。基本上我只想擁有一個我可以綁定的屬性,只要名字或姓氏改變,就會返回用戶的全名。這是我在修改中使用的最後一堂課。

public class Person : DependencyObject, INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public static readonly DependencyProperty FirstNameProperty = 
     DependencyProperty.Register("FirstName", 
            typeof (string), 
            typeof (Person), 
            null); 
    public static readonly DependencyProperty LastNameProperty = 
     DependencyProperty.Register("LastName", 
            typeof(string), 
            typeof(Person), 
            null); 
    public static readonly DependencyProperty FullNameProperty = 
     DependencyProperty.Register("FullName", 
            typeof(string), 
            typeof(Person), 
            null); 

    public string FirstName 
    { 
     get 
     { 
      return (string) GetValue(FirstNameProperty); 
     } 
     set 
     { 
      SetValue(FirstNameProperty, value); 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs("FirstName")); 
       PropertyChanged(this, new PropertyChangedEventArgs("FullName")); 
      } 
     } 
    } 

    public string LastName 
    { 
     get 
     { 
      return (string) GetValue(LastNameProperty); 
     } 
     set 
     { 
      SetValue(LastNameProperty, value); 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs("LastName")); 
       PropertyChanged(this, new PropertyChangedEventArgs("FullName")); 
      } 
     } 
    } 

    public string FullName 
    { 
     get { return GetValue(FirstNameProperty) + " " + GetValue(LastNameProperty); } 
    } 
} 

回答

3

我不知道你正試圖在這裏實現什麼,但爲什麼你的Person類自DependencyObject繼承和爲什麼名字和姓氏DependencyProperties?如果您只想將Person屬性綁定到視圖上的用戶控件,使Person類實現INotifyPropertyChanged足以使數據綁定起作用。您通常會將其綁定到依賴項屬性(例如TextBlock的Text屬性)的用戶控件的屬性。

試試這個你Person類:

using System.ComponentModel; 
public class Person : INotifyPropertyChanged 
{ 
    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void RaisePropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    #endregion 

    private string _firstName; 
    public string FirstName 
    { 
     get { return _firstName; } 
     set 
     { 
      if (value != _firstName) 
      { 
       _firstName = value; 
       RaisePropertyChanged("FirstName"); 
       RaisePropertyChanged("FullName"); 
      } 
     } 
    } 

    private string _lastName; 
    public string LastName 
    { 
     get { return _lastName; } 
     set 
     { 
      if (value != _lastName) 
      { 
       _lastName = value; 
       RaisePropertyChanged("LastName"); 
       RaisePropertyChanged("FullName"); 
      } 
     } 
    } 

    public string FullName 
    { 
     get { return FirstName + " " + LastName; } 
    } 
} 

而且在你看來像這樣使用:

<Grid x:Name="LayoutRoot" Background="White" > 
    <TextBlock Text="{Binding FullName}"/> 
</Grid> 

然後,在你的代碼隱藏,那麼你可以像這樣:

public partial class MainPage : UserControl 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 

     DataContext = new Person { FirstName = "John", LastName = "Doe" }; 
    } 
} 

HTH, Phil

+0

+1,這看起來不錯我。 – AnthonyWJones 2010-04-01 21:53:34

+0

我很新,在Silverlight中綁定。我發現的大多數例子都使用了DependencyProperty。最重要的是,我實際上無法讓我的綁定工作,直到我開始使用依賴屬性。到目前爲止,學習Silverlight綁定對我來說是一場穩步的艱苦戰鬥。 – Matt 2010-04-01 22:15:24

1

首先,您現有的FirstName和LastName屬性的實現存在缺陷。 DependencyObject已經有方法通知綁定的值和值的變化可以通過調用Setter方法之外的其他機制來改變。

我的第一個問題是爲什麼FirstNameLastName依賴屬性呢?這對於這類課程來說似乎是一個奇怪的選擇。菲爾的回答已經提供了我真正期待正確答案的東西。

但是如果你的代碼實際上是一個簡化和有其實真正需要在這裏創建依賴屬性是它應該怎麼做: -

public class Person : DependencyObject, INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public static readonly DependencyProperty FirstNameProperty = 
     DependencyProperty.Register("FirstName", 
            typeof (string), 
            typeof (Person), 
            OnNamePropertyChanged); 

    public static readonly DependencyProperty LastNameProperty = 
     DependencyProperty.Register("LastName", 
            typeof(string), 
            typeof(Person), 
            OnNamePropertyChanged); 

    private static void OnNamePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     ((Person)d).OnNamePropertyChanged(); 
    } 

    private void OnNamePropertyChanged() 
    { 
     if (PropertyChanged != null) 
     PropertyChanged(this, new PropertyChangedEventArgs("FullName"))); 
    } 

    public string FirstName 
    { 
     get { return GetValue(FirstNameProperty) as string; } 
     set { SetValue(FirstNameProperty, value); } 
    } 

    public string LastName 
    { 
     get { return GetValue(LastNameProperty) as string; } 
     set { SetValue(LastNameProperty, value); } 
    } 
    public string FullName 
    { 
     get { return FirstName + " " + LastName; } 
    } 
} 
相關問題