【问题标题】:WPF - CAL - Multiple parents for single instance of control?WPF - CAL - 单个控件实例的多个父级?
【发布时间】:2011-09-28 00:49:33
【问题描述】:

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

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

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

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

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

关于这个话题有什么想法吗?

克里斯

【问题讨论】:

    标签: wpf prism


    【解决方案1】:

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

    简而言之,不要将TextBlock 添加到您的StackPanel。相反,添加您的数据类型的实例(例如Customer)并将DataTemplateCustomer 类型相关联。没有办法在多个地方创建同一个UIElement

    【讨论】:

    • 谢谢,我是这么认为的...我目前正在使用纯代码(仍然更快,不习惯 XAML 并且在 Silverlight 的多目标环境中仍然很乱).. 将集合更改为ICommands 并为所有控件使用了“新”按钮。然后一切都很好..
    【解决方案2】:

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

    通常您应该按照 Kent 的建议使用 DataTemplates,但如果您有特殊情况,这可能会起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多