如何在Silverlight中绑定到助手属性
为了便于讨论,这里有一个简单的person类如何在Silverlight中绑定到助手属性,silverlight,data-binding,binding,dependency-properties,Silverlight,Data Binding,Binding,Dependency Properties,为了便于讨论,这里有一个简单的person类 public class Person : DependencyObject, INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public static readonly DependencyProperty FirstNameProperty = DependencyProperty.Regist
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; }
}
在这种情况下绑定是如何工作的?我尝试添加DependencyProperty并引发全名的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 ); }
}
}
我不确定您试图在这里实现什么,但为什么Person类继承自DependencyObject,为什么FirstName和LastName DependencyProperties?如果您只想将Person属性绑定到视图上的用户控件,那么更改实现INotifyPropertyChanged的Person类就足以使数据绑定工作。您通常会将其绑定到用户控件的属性,这些属性是依赖属性(例如TextBlock的Text属性) 为您的个人类别尝试以下操作:
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>
嗯,,
Phil我不确定您在这里想要实现什么,但是为什么您的Person类继承自DependencyObject,为什么FirstName和LastName DependencyProperties?如果您只想将Person属性绑定到视图上的用户控件,那么更改实现INotifyPropertyChanged的Person类就足以使数据绑定工作。您通常会将其绑定到用户控件的属性,这些属性是依赖属性(例如TextBlock的Text属性) 为您的个人类别尝试以下操作:
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>
嗯,,
Phil首先,现有FirstName和LastName属性的实现存在缺陷。DependencyObject已经有方法通知绑定对值的更改,并且可以通过调用Setter方法以外的其他机制更改值 我的第一个问题是为什么
FirstName
和LastName
都是依赖属性?对于这类课程来说,这似乎是一个奇怪的选择。菲尔的回答已经提供了我真正期望的正确答案
然而,如果您的代码实际上是一种简化,并且事实上确实需要创建依赖属性,那么应该这样做:-
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; }
}
}
首先,现有FirstName和LastName属性的实现存在缺陷。DependencyObject已经有方法通知绑定对值的更改,并且可以通过调用Setter方法以外的其他机制更改值 我的第一个问题是为什么
FirstName
和LastName
都是依赖属性?对于这类课程来说,这似乎是一个奇怪的选择。菲尔的回答已经提供了我真正期望的正确答案
然而,如果您的代码实际上是一种简化,并且事实上确实需要创建依赖属性,那么应该这样做:-
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; }
}
}
我对Silverlight的装订很陌生。我发现的大多数示例都使用DependencyProperty。最重要的是,在我开始使用依赖属性之前,我实际上无法使绑定工作。到目前为止,学习Silverlight绑定对我来说是一场持续的艰苦战斗。我对Silverlight绑定非常陌生。我发现的大多数示例都使用DependencyProperty。最重要的是,在我开始使用依赖属性之前,我实际上无法使绑定工作。到目前为止,学习Silverlight装订对我来说是一场持续的艰苦战斗。