C# 绑定到自定义控件属性

C# 绑定到自定义控件属性,c#,wpf,dependency-properties,C#,Wpf,Dependency Properties,我正在开发一个帐户列表下拉控件,它将在我的应用程序中使用。下拉列表将调用服务并检索可用帐户列表,并将在下拉列表中为所选项目显示属性“SelectedAccount”。SelectedAccount将成为DependencyProperty,因为它必须由AccountDropdown控件的使用者绑定,并且它必须是双向绑定的,以便反映现有SelectedAccount AccountDropdown.asmx很简单,它包含一个组合框: <ComboBox SelectedItem="{Bind

我正在开发一个帐户列表下拉控件,它将在我的应用程序中使用。下拉列表将调用服务并检索可用帐户列表,并将在下拉列表中为所选项目显示属性“SelectedAccount”。SelectedAccount将成为DependencyProperty,因为它必须由AccountDropdown控件的使用者绑定,并且它必须是双向绑定的,以便反映现有SelectedAccount

AccountDropdown.asmx很简单,它包含一个组合框:

<ComboBox SelectedItem="{Binding Path=SelectedAccount, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"...
。。。和通常的属性:

    #region SelectedAccount

    /// <summary>
    /// Selected account
    /// </summary>
    public IAccount SelectedAccount
    {
        get { return (IAccount)GetValue(SelectedAccountProperty); }
        set { SetValue(SelectedAccountProperty, value); }
    }
    #endregion SelectedAccount
#地区选择账户
/// 
///选定帐户
/// 
公共IAccount SELECTED帐户
{
获取{return(IAccount)GetValue(SelectedAccountProperty);}
set{SetValue(SelectedAccountProperty,value);}
}
#endregion SelectedAccount
属性在代码隐藏文件中定义。。。数据上下文设置为“this”。。。因此绑定设置正确

使用此控件时,我需要将SelectedAccount绑定到另一个视图的ViewModel属性,例如:

<Controls:AccountDropdown SelectedAccount="{Binding Path=SelectedAccount, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />

当我运行上述代码并更改下拉列表上的选择时,我会得到System.StackOverflow异常。我甚至无法调试它,异常是从Windows.Base.dll引发的

我已经为这个挣扎了一天了。。。任何帮助都将不胜感激


**注意:**我已经编写了几个带有依赖属性的WPF控件,它们工作得很好,但是当我使用它们时,我会在.asmx文件中显式地提供值。在这种情况下,当我使用属性时,我将再次绑定。我猜公开可绑定属性可能需要一些额外的技巧。

我猜SelectedAccountChanged方法会更新字段,从而导致无限递归,从而导致堆栈溢出

测试:从DependencyProperty.Register调用中删除SelectedAccountChanged,以确保这是错误的来源,然后检查方法本身


如果您需要帮助,请将方法张贴在那里。

好的,通常情况下,解决方案很简单。AccountDropdown控件的DataContext被隐式设置为自身,因此是无限循环。只需指定DataContext以使用正在使用它的控件的DataContext(因此使用预期的ViewModel绑定):


我仍然需要弄清楚如何告诉控件使用包含它的控件的数据上下文。。。如果我弄明白了,我会把它贴在这里。。。或者,如果你们中有人知道,请透露一些信息


再次感谢回复者。

感谢Erno。。。我用一些额外的细节更新了这个问题。实际上,我添加回调只是为了检查值是否正在“更改”,在调试模式下,它只命中了一次代码,但该方法什么也没做。我再次删除了它(并复制了这个问题只是为了确保),这个问题已经更新了这个信息和一些额外的细节。再次感谢。子控件隐式地从其父控件“获取”datacontext。部分DataContext=“{Binding}”没有添加任何内容。实际上不是这样。这就是解决问题的方法。因为datacontext指向控件而不是父对象,这就是无限循环的原因。我在其他控件中也看到了这一点,尽管我没有经历过无限循环。作为WPF扩展工具包的一部分,有几个控件需要显式设置数据上下文,否则它们将无法工作。我指的是默认控件,而不是愚蠢的人在控件中所做的操作。;)
<Controls:AccountDropdown SelectedAccount="{Binding Path=SelectedAccount, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
<Controls:AccountDropdown DataContext="{Binding}" SelectedAccount="{Binding Path=SelectedAccount, Mode=TwoWay}" />