我有一个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?
答案 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;
}
}