2011-10-17 141 views
1

后,我有一个用户控件(AgreementDetails)在WPF与下面的DependencyProperty和功能:依赖属性重置设置的DataContext

// 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; 
    } 

我用这个用户控件来显示在另一个用户控件(控制板)一个提示,我设置在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来从数据库中获取一些数据在用户控件来显示。我这样做的第一次,一切顺利。但是,当我在AgreementDetails中将传入的WCF DataContract设置为datacontext时,AgreementID属性重置为0,因此第二次调用将不起作用,因为显然我没有与AgreementID = 0达成一致。我检查并将AgreementID重置为SetBindingContext ();方法设置DataContext之后。

我如何使它在AgreementDetails中设置新的dataContext后不会重置AgreementID属性?

如果需要可以提供更多信息。

编辑:我现在有下面的代码:

// 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()方法,以便绑定不重置我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" /> 

Elem entName = AgreementDetails是我的UserControl的名称。奇怪的是{RelativeSource Self}它不起作用...

+0

所以您将*秒*用户控件的DataContract的DataContext的?并且DataContract在路径'Months [9] .AgreementID'中有一个非零值的属性? –

+0

“但是当我将传入的WCF DataContract设置为UserControl的datacontext时,AgreementID属性重置为0” 我需要知道在执行上述操作时界面上的AgreementID值是多少。它是否也更新为0? –

+0

这两个UserControl有两个不同的合约作为它的dataContext。问题是在DataContext在工具提示UserControl –

回答

1

当你在你的UserControl中设置datacontext时,你实际上也在重置父控件中的数据上下文(Dashboard)。这是相同的背景。因此,您的协议ID不再处于上下文中,因此得到重置。

编辑:其实我没说得那么好。您不会影响仪表板中的数据上下文,但会影响该控件中声明的AgreementId绑定使用的数据上下文。绑定在Dashboard控件中声明,但绑定实际上是在您要重置的子控件的数据上下文中查找的。

见我类似的问题在这里: Setting DataContext within UserControl is affecting bindings in parent

编辑:这里是我的意思是:

// 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,你可能有这样的:

<!-- Bound to property in DataContext --> 
<TextBlock Text={Binding SomeContractProperty} /> 

结合需要改变到其中:

<!-- Bound to new property on UC1001_AgreementDetails_View (UserControl) --> 
<TextBlock Text={Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UC1001_AgreementDetails_View}}, Path=Agreement.SomeContractProperty} /> 
+0

解释是有道理的。但恐怕我不能得到解决方案,因为datacontext是在运行时设置的“child”-usercontrol中的WCF数据合同,您如何建议我实现一个工作解决方案? –

+0

您需要停止在子项中设置DataContext。而是暴露作为WCF数据合同实例的子控件(Agreement?)中的一些其他属性,并将其绑定到该控件。然后可以在AgreementId更改时设置此实例,而不是设置DataContext。 – GazTheDestroyer

+0

我做了DataContract类型的另一个DependencyProperty作为DataContext在子UserControl中使用,但是我怎么能传递它在我的父UserControl中,因为我只在子UserControl中声明它? –