简体   繁体   中英

Silverlight CustomControl dependency property can't be bound to parent viewmodel

I'm having a custom Control that has a dependency property

    public static readonly DependencyProperty SelectedUserCodeProperty = DependencyProperty.Register(
    "SelectedUserCode",                               
    typeof(decimal),                           
    typeof(SystemUsersControl),             
    new PropertyMetadata(SelectedUserCodeChanged));
public decimal SelectedUserCode
    {
        get
        {
            return (decimal)this.GetValue(SelectedUserCodeProperty);
        }
        set
        {
            this.SetValue(SelectedUserCodeProperty, value);
            RaisePropertyChanged("SelectedUserCode");
        }
    }

This control is inside another usercontrol that I'm attempting to get the dependency property above in its viewmodel this xaml is inside the parent control

<SystemUsers:SystemUsersControl Name="ctrlSystemUsersControl" SelectedUserCode="{Binding SelectedSystemUserCode, Mode=TwoWay}" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,2,0,0"/>

but nothing is bound to the parent control viewmodel

I don't know what's the problem, it's my first time dealing with dependency properties, I'm considering making the two controls in one :( unless I got any help :)

Don't worry,

SelectedSystemUserCode must be a property . If its a property you will see initial value ,but what will fully support binding for your class is ,implementation of INotifyPropertyChanged. This basic interface will be a messenger for us.

1)When you implement INotifyPropertyChanged,the below event will be added to your class.

  public event PropertyChangedEventHandler PropertyChanged;

2)Then create a firing method

 public void FirePropertyChanged(string prop)
 {
     if(PropertyChanged!=null)
     {
       PropertyChanged(prop);
      }
  }

3) Register this event for not getting null reference.

  in constructor this.PropertyChanged(s,a)=>{ //may do nothing };

4) //You may use Lazy < T > instead of this.

  public decimal SelectedSystemUserCode
 {
    get{
          if(_selectedSystemUserCode==null)
              {
                      _selectedSystemUserCode=default(decimal);
              }
        return _selectedSystemUserCode;
      }
    set
      {
     _selectedSystemUserCode=value;
      FirePropertyChanged("SelectedSystemUserCode"); 
      //This will be messanger for our binding
      }
   }

In addition, As I remember is the default value so you may give a decimal value for that,SelectedUserCodeChanged is callback method its ok also.

 //new PropertyMetadata(SelectedUserCodeChanged) 
 new PropertyMetadata(0) or null

Hope helps.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM