【问题标题】:Silverlight CustomControl dependency property can't be bound to parent viewmodelSilverlight CustomControl 依赖属性不能绑定到父视图模型
【发布时间】:2012-11-04 06:48:31
【问题描述】:

我有一个具有依赖属性的自定义控件

    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");
        }
    }

这个控件在另一个用户控件中,我试图在它的视图模型中获取上面的依赖属性 此 xaml 在父控件内

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

但没有任何东西绑定到父控件视图模型

我不知道是什么问题,这是我第一次处理依赖属性,我正在考虑将两个控件合二为一:(除非我得到任何帮助:)

【问题讨论】:

  • 你不需要 "RaisePropertyChanged("SelectedUserCode");"在设置器中。
  • 您确定SelectedSystemUserCode 绑定正确吗?有关绑定错误,请参见输出窗口。另外,您能否显示为您的UserControl 设置DataContext 的代码?

标签: c# .net silverlight mvvm


【解决方案1】:

别担心,

SelectedSystemUserCode 必须是一个属性。如果它是一个属性,您将看到初始值,但是完全支持您的类绑定的是 INotifyPropertyChanged 的​​实现。这个基本界面将成为我们的信使。

1)当你实现 INotifyPropertyChanged 时,下面的事件将被添加到你的类中。

  public event PropertyChangedEventHandler PropertyChanged;

2)然后创建一个触发方法

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

3) 注册此事件以不获取空引用。

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

4) //你可以用懒惰的代替这个。

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

此外, 我记得是默认值,所以你可以给它一个十进制值,SelectedUserCodeChanged 是回调方法也可以。

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

希望有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 2012-04-13
    • 2010-12-16
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    相关资源
    最近更新 更多