【问题标题】:Complex custom control and properties visibility复杂的自定义控件和属性可见性
【发布时间】: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)在这里并不重要,只是说我有其他公共属性供我的用户绑定。即控件应该这样使用:&lt;tfs:MultiSelectorControl ItemsSource="{Binding AllWorkers}" SelectedItems="{Binding Path=SelectedWorkers,Mode=TwoWay}" /&gt;
  • 那么在这种情况下,为什么不能将ItemsWrapper 属性声明为私有依赖属性Key(即注册为只读的依赖属性)呢?
  • 因为它并没有完全解决问题。阅读我在回答下方的评论。
  • 然后概括\抽象它,使用object类型或使用一些自定义接口抽象类。接口隐藏了实现。

标签: c# .net wpf user-controls


【解决方案1】:

属性必须是公共的,但对象本身可能不是。因此,作为另一种可能的解决方案,您可以将此属性封装在另一个类中,在您的控件中将该类的实例设为私有并绑定到它。

【讨论】:

    【解决方案2】:

    您可以将ItemWrappers 设为只读依赖属性。

    【讨论】:

    • 这是朝着正确方向迈出的一步,但最终我希望 ItemWrapper 类也是内部的 - 没有人必须知道控件内部是如何完成的。
    猜你喜欢
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 2021-07-27
    • 2014-11-26
    • 1970-01-01
    • 2015-05-11
    • 2021-08-15
    • 1970-01-01
    相关资源
    最近更新 更多