C# 设置DataContext后重置依赖项属性

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)

我在WPF中有一个UserControl(AgreementDetails),具有以下从属属性和功能:

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