WPF - CAL - 单个控件实例的多个父级?

时间:2009-10-04 16:42:40

标签: wpf prism

我正在研究PRISM / CAL解决方案,但问题可能是WPF特定的:

如果我创建一个控件实例(例如TextBlock)并将其作为子项添加到StackPanel,则无法将其作为“child”添加到另一个StackPanel(父级已设置错误)。我有点理解原因(使用RegionManager时也会发生这种情况)。

但是如果视觉控制非常复杂并且只创建一次并在两个地方使用,建议的方法是什么?我同意在屏幕上显示相同的控件2次是没有意义的,但可能会出现有用的情况(例如“全部关闭”按钮)。

我知道在按钮的情况下,我应该创建两个按钮,数据绑定到一个ICommand。但是这个规则是否也适用于更复杂的控件(总是创建新实例)......

我在创建布局切换器时偶然发现了这个问题,该切换器单独为每个GUI创建按钮列表和堆栈面板,但使用静态ObservableCollection按钮作为源(这会导致奇怪的错误)..

关于这个主题的任何想法?

克里斯

2 个答案:

答案 0 :(得分:1)

这通常由模板处理。也就是说,您将数据抽象为特定类型,并将模板与该类型相关联。然后将该数据的实例多次放入可视树中,让WPF使用模板对其进行渲染。

简而言之,请勿向TextBlock添加StackPanel。而是添加数据类型的实例(例如Customer)并将DataTemplateCustomer类型相关联。无法在多个地方为同一个UIElement提供父级。

答案 1 :(得分:0)

您可以将控件(或控件集合)添加为资源,并通过控件中的绑定来引用它们。这将隐式创建一个副本(它们将是Freezable,WPF将复制它们)。

一般来说,你应该像肯特建议的那样使用DataTemplates,但是如果你有特殊情况,这可能会有用。