【发布时间】:2011-11-14 08:23:42
【问题描述】:
我正在开发一个自定义 WPF 控件(“多重选择器”)。我给我的用户ItemsSource 属性用于绑定目的,但在内部我使用这样的 ItemWrappers 集合:
<UserControl x:Class="TFSControls.MultiSelectorControl.MultiSelectorControl">
<ItemsControl Name="ItemsPresenter" ItemsSource="{Binding ItemWrappers}">
...
</ItemsControl>
</UserControl>
问题在于,为了让这个绑定起作用,ItemWrappers 属性必须是公开的。 我会对 internal 感到满意,因为控件位于它自己的程序集中。
实现这一目标的最简单方法是什么?
我知道的唯一解决方案是在我的程序集中对 ItemsControl 进行子类化,但这似乎不对 - 我不需要自定义行为,只希望这个属性是内部的/受保护的。
【问题讨论】:
-
您想说的是,您希望某些集合属性从您的用户控件公开,但不是
ItemWrappers。对吗? -
我希望 ItemWrappers 是内部的,并且能够在我使用 ItemsControl 的控件内部绑定到它(如上所示)。另一个属性(ItemsSource)在这里并不重要,只是说我有其他公共属性供我的用户绑定。即控件应该这样使用:
<tfs:MultiSelectorControl ItemsSource="{Binding AllWorkers}" SelectedItems="{Binding Path=SelectedWorkers,Mode=TwoWay}" /> -
那么在这种情况下,为什么不能将
ItemsWrapper属性声明为私有依赖属性Key(即注册为只读的依赖属性)呢? -
因为它并没有完全解决问题。阅读我在回答下方的评论。
-
然后概括\抽象它,使用
object类型或使用一些自定义接口抽象类。接口隐藏了实现。
标签: c# .net wpf user-controls