【发布时间】:2011-10-17 08:39:36
【问题描述】:
我在 WPF 中有一个 UserControl (AgreementDetails),具有以下 DependencyProperty 和功能:
// 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>
在 AgreementDetails 中,我使用 AgreementID 从数据库中获取一些数据以显示在 UserControl 中。我第一次这样做,一切都很顺利。但是当我在 AgreementDetails 中将传入的 WCF DataContract 设置为 datacontext 时,AgreementID 属性重置为 0,因此第二次调用将不起作用,因为显然我没有与 AgreementID = 0 的协议。我检查并在 SetBindingContext 中重置了 AgreementID ();设置 DataContext 后的方法。
我怎样才能做到让 AgreementID 属性在我在 AgreementDetails 中设置新的 dataContext 后不会重置??
如果需要,可以提供更多信息。
编辑:我现在有以下代码:
// Dependency properties
public int AgreementID
{
get { return (int)GetValue(AgreementIDProperty); }
set { SetValue(AgreementIDProperty, value); }
}
public UC1001_ActiveAgreementContract AgreementDetailsContract
{
get { return (UC1001_ActiveAgreementContract)GetValue(AgreementDetailsContractProperty); }
set { SetValue(AgreementDetailsContractProperty, value); }
}
public static readonly DependencyProperty AgreementIDProperty = DependencyProperty.Register("AgreementID", typeof(int), typeof(UC1001_AgreementDetails_View), new PropertyMetadata(null));
public static readonly DependencyProperty AgreementDetailsContractProperty = DependencyProperty.Register("AgreementDetailsContract", 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();
AgreementDetailsContract = client.GetAgreementDetailsByAgreementID(AgreementID);
}
private void SetBindingContext()
{
this.DataContext = AgreementDetailsContract;
}
我还有设置DataContext后AgreementID重置为0的问题。
另外,当我使用以下语句绑定时,我得到一个空标签:
<Label Content="{Binding RelativeSource={RelativeSource Self}, Path=AgreementDetailsContract.EndClientName}" />
已解决:
我删除了 SetDataBinding() 方法,因此 Binding 不会重置我的 DependencyProperty,并且对于我的标签的绑定,我使用了以下 Binding(而不是 RelativeSource Self):
<Label Content="{Binding ElementName=AgreementDetails, Path=AgreementDetailsContract.EndClientName}" Grid.Column="1" Grid.Row="1" Height="28" HorizontalAlignment="Left" Margin="11,0,0,0" Name="_labelEindklant" VerticalAlignment="Top" />
ElementName=AgreementDetails 是我的用户控件的名称。奇怪的是,{RelativeSource Self} 没用...
【问题讨论】:
-
所以您将 second UserControl 的 DataContext 设置为 DataContract?并且那个 DataContract 肯定在路径
Months[9].AgreementID处有一个非零值的属性? -
"但是当我将传入的 WCF DataContract 设置为 UserControl 的数据上下文时,AgreementID 属性重置为 0" 当您执行上述操作时,我需要知道界面上的 AgreementID 值是多少。它也更新为 0 吗?
-
两个 UserControl 有两个不同的契约作为它的 dataContext。问题是在工具提示 UserControl 处设置 DataContext 后,AgreementID 值重置为 0
-
您是否检查过工具提示 DataContract 肯定在路径 Months[9].AgreementID 具有非零值的属性?
-
工具提示 DataContract 仅使用 AgreementID 作为参数来获取正确的协议。我想我不太明白你的问题。我将在我的问题中添加更多代码,以便您更好地理解问题。
标签: c# wpf data-binding user-controls dependency-properties