DataContext,DependencyProperties和Bindings

时间:2011-06-14 13:55:17

标签: c# silverlight data-binding

我有一个UserControl,我们称之为“Header”。它有一个名为ProjectID的DependencyProperty,这个控件有一个View Model,我将它设置为DataContext:

public BillingInfoHeaderControlVM VM
{
    get
    {
        return (BillingInfoHeaderControlVM)DataContext;
    }
    set
    {
        DataContext = value;
    }

}

public static readonly DependencyProperty ProjectIDProperty =
                        DependencyProperty.Register("ProjectID", typeof(int), typeof(BillingInfoHeaderControl), new PropertyMetadata();

public int ProjectID
{
    set
    {
        SetValue(ProjectIDProperty, value);
    }
    get
    {
        return (int)GetValue(ProjectIDProperty);
    }
}

现在我要做的是将控件的ProjectID绑定到此控件的ProjectID:

<controls:Header Grid.Row ="0" x:Name="Header" ProjectID="{Binding ProjectID, Mode=OneWay}"></controls:Header>

现在当我运行它时,我在InitializeControl()方法中收到错误,指出“

  

找不到属性Get方法。

从我正在阅读的内容中,我看到这是因为Binding ProjectID是相对于控件的数据上下文。当然,我可以在绑定中设置ElementName:

<controls:Header Grid.Row ="0" x:Name="Header" ProjectID="{Binding ProjectID, Mode=OneWay, ElementName=ParentControl}"></controls:Header>

但这很难看,说实话,我们不想在每次使用它时都记得为这个控件做这个。我还有其他选择吗?有没有办法设置绑定源来使用父级的DataContext?

1 个答案:

答案 0 :(得分:0)

我在代码中复制了你的概念,它编译并运行良好。

我已经包含了下面的控制代码和视图模型,以防你做了不同的事情。

*注意:我将viewmodel ProjectID保存为一个简单的更新属性。:

namespace Demo1
{
    public partial class BillingInfoHeaderControl : UserControl
    {
        public BillingInfoHeaderControl()
        {
            InitializeComponent();
            this.DataContext = new BillingInfoHeaderControlVM();
        }

        public int ProjectId
        {
            get { return (int)GetValue(ProjectIdProperty); }
            set { SetValue(ProjectIdProperty, value); }
        }

        public static readonly DependencyProperty ProjectIdProperty =
            DependencyProperty.Register("ProjectId", typeof(int), typeof(BillingInfoHeaderControl),
              new PropertyMetadata(0));

    }
}

namespace Demo1
{
    public class BillingInfoHeaderControlVM : INotifyPropertyChanged
    {
        private int _projectId;
        public int ProjectId
        {
            get { return _projectId; }
            set
            {
                if (_projectId != value)
                {
                    _projectId = value;
                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("ProjectId"));
                    }
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
}