我正在开发一个帐户列表下拉控件,该控件将在我的应用程序中使用。下拉列表将调用服务并检索可用帐户列表,并在下拉列表中显示所选项目的属性“SelectedAccount”。 SelectedAccount将成为DependencyProperty,因为它必须由AccountDropdown控件的使用者绑定,并且必须是双向可绑定的,因此它反映了现有的SelectedAccount。
AccountDropdown.asmx很简单,它包含一个ComboBox:
<ComboBox SelectedItem="{Binding Path=SelectedAccount, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"...
组合框的选定项目绑定到注册为
的属性DependencyProperty.Register("SelectedAccount", typeof(IAccount), typeof(AccountDropdown),
new UIPropertyMetadata(null));
......和通常的财产:
#region SelectedAccount
/// <summary>
/// Selected account
/// </summary>
public IAccount SelectedAccount
{
get { 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文件中显式提供了值。在这种情况下,当我使用属性时,我再次绑定。我猜测暴露一个可绑定的属性可能需要一些额外的技巧。
答案 0 :(得分:1)
好的,通常情况下,解决方案很简单。 AccountDropdown控件的DataContext被隐式设置为自身,因此是无限循环。只需指定DataContext即可使用控件的DataContext(因此使用预期的ViewModel绑定):
<Controls:AccountDropdown DataContext="{Binding}" SelectedAccount="{Binding Path=SelectedAccount, Mode=TwoWay}" />
我仍然需要弄清楚如何告诉控件使用容纳它的控件的数据上下文...如果我弄清楚,我会在这里发布...或者如果你们中的任何人都知道请详细说明。
再次感谢那些回复的人。
答案 1 :(得分:0)
我想SelectedAccountChanged方法会更新字段,从而导致无限递归,从而导致堆栈溢出。
要测试:从DependencyProperty.Register调用中删除SelectedAccountChanged以确保这是错误的来源,然后检查方法本身。
如果你需要帮助,可以在那里发布方法。