基本上,我希望我的 UserControl 能够接受一种 ItemsControl,这样我的 XAML 就可以如下所示:
<my:MyControl DataContext="{Binding InnerViewModel}">
<ItemsControl ... />
</my:MyControl>
那样的话,MyControl 会显示自定义 Items 控件和其他控件吗?
最佳答案
首先注意几点:
- A
UserControl
是ContentControl
的一种.这意味着您不能将子元素传递到 UserControl。您可以覆盖内容,但这对于您想要完成的事情来说是徒劳的。 - 如果您想要一个包含SINGLE 子元素的控件,您正在寻找
Decorator
。类。 - 如果您想要一个包含MULTIPLE 个子元素的控件,您正在寻找
ItemsControl
。类。
所以,基本上你做错了。话虽这么说,有几种方法可以完成你想要的。您可以简单地使用 ItemsControl 并使用您自己的模板覆盖模板。您还可以创建一个继承自 ItemsControl 或 Decorator 的 CustomControl。
覆盖模板(作为一种样式)将是更简单的方法,所以我的建议是这样做,除非您非常精通如何正确地创建 WPF 自定义控件b>.
如果您选择使用自定义控件,看起来您可能想要作为装饰者这样做(只是猜测您想要一个单独的 child )。烦人的部分是,要真正创建编写良好的 WPF 自定义控件,您必须具备一些非常好的技能。例如,Border
是一种包含一些 DependencyProperty
属性的装饰器。该模板附带了 PresentationFramework.dll(我认为),因此它具有一些默认的外观。边框(自定义控件)并不难写。当您想真正拥有交互逻辑时,会变得非常烦人。您需要进行制衡以确保从模板中检索到控件引用。然后,只有到那时,如果引用不为空,您才能继续执行您的逻辑。基本上,假设您编写了一种具有 2 个按钮来执行逻辑的自定义控件,并且您提供了一个默认模板,其中按钮被命名为“按钮 1”和“按钮 2”。您不能只从模板中拉出 Button 1 和 Button 2 并期望它们在那里;有人可以轻松地覆盖您的默认模板并删除 Button 1 和 Button 2,从而使您的自定义控件无用(几乎)。糟糕的是,如果您在编码时不考虑这些情况。您的自定义控件将遇到 NullReferenceException
。更不用说您必须连接起来以允许每个按钮的命令绑定(bind),您还应该为每个按钮提供一个 routedevent。基本上,自定义控件对于您想要执行的操作来说可能有点太多(可能)。
我可能是错的,您可能非常熟练并且知道如何制作自定义控件。或者,更好的是,您可能只是想要一种简单的方法来装饰 ItemsControl,比如在其顶部添加横幅?我不知道,但我确定你知道:)
总的来说,我会研究如何重写 ItemsControl 模板。这是一个示例:
<Window x:Class="Sample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="640" Height="480">
<Window.Resources>
<Style x:Key="ItemsControlStyle1" TargetType="{x:Type ItemsControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ItemsControl}">
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
<StackPanel Orientation="Vertical">
<TextBlock Text="A HEADER!" />
<ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</StackPanel>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid x:Name="LayoutRoot">
<ItemsControl Style="{DynamicResource ItemsControlStyle1}" />
</Grid>
</Window>
关于WPF - 如何将其他控件传递到我的 UserControl 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6793433/