Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Silverlight中绑定到助手属性_Silverlight_Data Binding_Binding_Dependency Properties - Fatal编程技术网

如何在Silverlight中绑定到助手属性

如何在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

为了便于讨论,这里有一个简单的person类

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装订对我来说是一场持续的艰苦战斗。