C# 设置DataContext后重置依赖项属性
我在WPF中有一个UserControl(AgreementDetails),具有以下从属属性和功能:C# 设置DataContext后重置依赖项属性,c#,wpf,data-binding,user-controls,dependency-properties,C#,Wpf,Data Binding,User Controls,Dependency Properties,我在WPF中有一个UserControl(AgreementDetails),具有以下从属属性和功能: // UserControl AgreementDetails public int AgreementID { get { return Convert.ToInt32(GetValue(AgreementIDProperty)); } set { SetValue(AgreementIDProperty, value)
// UserControl AgreementDetails
public int AgreementID
{
get { return Convert.ToInt32(GetValue(AgreementIDProperty)); }
set { SetValue(AgreementIDProperty, value); }
}
public static readonly DependencyProperty AgreementIDProperty = DependencyProperty.Register("AgreementID", typeof(int), typeof(UC1001_AgreementDetails_View), new PropertyMetadata(null));
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
int id = AgreementID;
if (id > 0)
{
GetData();
SetBindingContext();
this.Visibility = System.Windows.Visibility.Visible;
}
else
{
this.Visibility = System.Windows.Visibility.Collapsed;
}
}
private void GetData()
{
ConsultantServiceClient client = new ConsultantServiceClient();
_contract = new UC1001_ActiveAgreementContract();
_contract = client.GetAgreementDetailsByAgreementID(AgreementID);
}
private void SetBindingContext()
{
this.DataContext = _contract;
}
我使用此UserControl在另一个UserControl(仪表板)中显示为工具提示,其中我设置了AgreementID属性:
// Dashboard
<Setter Property="DataGridCell.ToolTip">
<Setter.Value>
<my:UC1001_AgreementDetails_View Background="#FFF" Opacity="0.88" AgreementID="{Binding Months[9].AgreementID}"/>
</Setter.Value>
</Setter>
设置DataContext后,AgreementID重置为0仍然存在问题
另外,当我使用以下语句绑定时,会得到一个空标签:
<Label Content="{Binding RelativeSource={RelativeSource Self}, Path=AgreementDetailsContract.EndClientName}" />
已解决:
// UserControl AgreementDetails
public int AgreementID
{
get { return Convert.ToInt32(GetValue(AgreementIDProperty)); }
set { SetValue(AgreementIDProperty, value); }
}
//The new property to bind to instead of DataContext
public UC1001_ActiveAgreementContract Agreement
{
get { return (UC1001_ActiveAgreementContract)GetValue(AgreementProperty); }
private set { SetValue(AgreementProperty, value); }
}
public static readonly DependencyProperty AgreementIDProperty = DependencyProperty.Register("AgreementID", typeof(int), typeof(UC1001_AgreementDetails_View), new PropertyMetadata(null));
//should really be readonly dependency property
public static readonly DependencyProperty AgreementProperty = DependencyProperty.Register("Agreement", typeof(UC1001_ActiveAgreementContract), typeof(UC1001_AgreementDetails_View), new PropertyMetadata(null));**
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
int id = AgreementID;
if (id > 0)
{
GetData();
SetBindingContext();
this.Visibility = System.Windows.Visibility.Visible;
}
else
{
this.Visibility = System.Windows.Visibility.Collapsed;
}
}
private void GetData()
{
ConsultantServiceClient client = new ConsultantServiceClient();
_contract = new UC1001_ActiveAgreementContract();
_contract = client.GetAgreementDetailsByAgreementID(AgreementID);
}
private void SetBindingContext()
{
this.Agreement = _contract;
}
我删除了SetDataBinding()方法,因此绑定不会重置DependencyProperty,对于标签的绑定,我使用了以下绑定(而不是RelativeSource Self):
ElementName=AgreementDetails是我的UserControl的名称。奇怪的是,{RelativeSource Self}它没有工作…当您在Usercontrol中设置datacontext时,实际上您也在重置父控件(仪表板)中的数据上下文。这是相同的背景。因此,您的协议ID不再在上下文中,因此会重置 编辑:事实上,我对这个词说得不太好。您不会影响仪表板中的数据上下文,但会影响该控件中声明的AgreementId绑定所使用的数据上下文。绑定是在仪表板控件中声明的,但是绑定实际上是在子控件的数据上下文中查找的,您正在重置该子控件 请看我的类似问题: 编辑:我的意思是:
// UserControl AgreementDetails
public int AgreementID
{
get { return Convert.ToInt32(GetValue(AgreementIDProperty)); }
set { SetValue(AgreementIDProperty, value); }
}
//The new property to bind to instead of DataContext
public UC1001_ActiveAgreementContract Agreement
{
get { return (UC1001_ActiveAgreementContract)GetValue(AgreementProperty); }
private set { SetValue(AgreementProperty, value); }
}
public static readonly DependencyProperty AgreementIDProperty = DependencyProperty.Register("AgreementID", typeof(int), typeof(UC1001_AgreementDetails_View), new PropertyMetadata(null));
//should really be readonly dependency property
public static readonly DependencyProperty AgreementProperty = DependencyProperty.Register("Agreement", typeof(UC1001_ActiveAgreementContract), typeof(UC1001_AgreementDetails_View), new PropertyMetadata(null));**
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
int id = AgreementID;
if (id > 0)
{
GetData();
SetBindingContext();
this.Visibility = System.Windows.Visibility.Visible;
}
else
{
this.Visibility = System.Windows.Visibility.Collapsed;
}
}
private void GetData()
{
ConsultantServiceClient client = new ConsultantServiceClient();
_contract = new UC1001_ActiveAgreementContract();
_contract = client.GetAgreementDetailsByAgreementID(AgreementID);
}
private void SetBindingContext()
{
this.Agreement = _contract;
}
然后,在AgreementDetails.xaml中,您可能有如下内容:
哪些绑定需要更改为:
在Usercontrol中设置datacontext时,实际上也在重置父控件(仪表板)中的数据上下文。这是相同的背景。因此,您的协议ID不再在上下文中,因此会重置 编辑:事实上,我对这个词说得不太好。您不会影响仪表板中的数据上下文,但会影响该控件中声明的AgreementId绑定所使用的数据上下文。绑定是在仪表板控件中声明的,但是绑定实际上是在子控件的数据上下文中查找的,您正在重置该子控件 请看我的类似问题: 编辑:我的意思是:
// UserControl AgreementDetails
public int AgreementID
{
get { return Convert.ToInt32(GetValue(AgreementIDProperty)); }
set { SetValue(AgreementIDProperty, value); }
}
//The new property to bind to instead of DataContext
public UC1001_ActiveAgreementContract Agreement
{
get { return (UC1001_ActiveAgreementContract)GetValue(AgreementProperty); }
private set { SetValue(AgreementProperty, value); }
}
public static readonly DependencyProperty AgreementIDProperty = DependencyProperty.Register("AgreementID", typeof(int), typeof(UC1001_AgreementDetails_View), new PropertyMetadata(null));
//should really be readonly dependency property
public static readonly DependencyProperty AgreementProperty = DependencyProperty.Register("Agreement", typeof(UC1001_ActiveAgreementContract), typeof(UC1001_AgreementDetails_View), new PropertyMetadata(null));**
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
int id = AgreementID;
if (id > 0)
{
GetData();
SetBindingContext();
this.Visibility = System.Windows.Visibility.Visible;
}
else
{
this.Visibility = System.Windows.Visibility.Collapsed;
}
}
private void GetData()
{
ConsultantServiceClient client = new ConsultantServiceClient();
_contract = new UC1001_ActiveAgreementContract();
_contract = client.GetAgreementDetailsByAgreementID(AgreementID);
}
private void SetBindingContext()
{
this.Agreement = _contract;
}
然后,在AgreementDetails.xaml中,您可能有如下内容:
哪些绑定需要更改为:
那么您将第二个UserControl的DataContext设置为DataContract?而且该DataContract在路径Months[9].AgreementID
上肯定有一个属性,具有非零值?“但是当我将传入的WCF DataContract设置为UserControl的datacontext时,AgreementID属性重置为0”执行上述操作时,我需要知道接口上的AgreementID值是多少。它是否也更新为0?这两个UserControl有两个不同的协定作为其dataContext。问题在于,在tooltip UserControls上设置DataContext后,AgreementID值重置为0,并且您是否已检查tooltip DataContract在路径Months[9]处是否确实具有属性。AgreementID值为非零值?tooltip DataContract仅将AgreementID用作参数以获得正确的协议。我想我不太明白你的问题。我将在我的问题中添加更多的代码,以便您更好地理解问题。那么您将第二个UserControl的DataContext设置为DataContract?而且该DataContract在路径Months[9].AgreementID
上肯定有一个属性,具有非零值?“但是当我将传入的WCF DataContract设置为UserControl的datacontext时,AgreementID属性重置为0”执行上述操作时,我需要知道接口上的AgreementID值是多少。它是否也更新为0?这两个UserControl有两个不同的协定作为其dataContext。问题在于,在tooltip UserControls上设置DataContext后,AgreementID值重置为0,并且您是否已检查tooltip DataContract在路径Months[9]处是否确实具有属性。AgreementID值为非零值?tooltip DataContract仅将AgreementID用作参数以获得正确的协议。我想我不太明白你的问题。我将在我的问题中添加一些代码,以便您更好地理解这个问题。解释是有道理的。但我恐怕无法获得解决方案,因为datacontext是在运行时设置的“child”-usercontrol中的WCF datacontract,您建议我如何实现工作解决方案?您需要停止在child中设置datacontext。相反,在子控件(协议?)中公开WCF datacontract实例的其他属性,并绑定到该属性。然后,您可以在AgreementId更改时设置此实例,而不是设置DataContext。我在子UserControl中创建了用作DataContext的DataContract类型的另一个DependencyProperty,但是我如何在父UserControl中传递它,因为我只在子UserControl中声明它?为什么您需要在父UserControl中使用它?父控件唯一需要访问的是Id。一旦设置了Id,您就可以从WCF创建新属性,并且您的子控件XAML可以绑定到该属性。因此,您想说的是,这与我现在在GetData()和SetDataBindings()方法中所做的不一样吗?这就是我的理解,事实上。。。我父母有孩子需要的协议ID。我使用DependencyProperty将ID传递给孩子。在child中,我在DataContract中从我的WCF主机获取正确的数据,然后将该DataContract作为数据源绑定到我的child。此绑定导致AgreementID在父级中消失,因为由于子级中有新绑定,父级中的绑定将重置。此解释很有意义。但我恐怕无法获得解决方案,因为datacontext是设置为runt的“child”用户控件中的WCF datacontract