如何解决DataContext,DependencyProperties和Binding
| 我有一个UserControl,我们称之为\“ Header \”。它具有一个名为ProjectID的DependencyProperty,此控件具有一个View模型,我将其设置为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?
解决方法
我在代码中复制了您的概念,它可以编译并运行良好。
如果您做了其他操作,我在下面包括了控制代码和viewmodel。
*注意:我将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;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。