WPF - 如何将其他控件传递到我的 UserControl 中?

标签 wpf xaml mvvm user-controls itemscontrol

基本上,我希望我的 UserControl 能够接受一种 ItemsControl,这样我的 XAML 就可以如下所示:

<my:MyControl DataContext="{Binding InnerViewModel}">
    <ItemsControl ... />
</my:MyControl>

那样的话,MyControl 会显示自定义 Items 控件和其他控件吗?

最佳答案

首先注意几点:

  1. A UserControlContentControl 的一种.这意味着您不能将子元素传递到 UserControl。您可以覆盖内容,但这对于您想要完成的事情来说是徒劳的。
  2. 如果您想要一个包含SINGLE 子元素的控件,您正在寻找Decorator。类。
  3. 如果您想要一个包含MULTIPLE 个子元素的控件,您正在寻找ItemsControl。类。

所以,基本上你做错了。话虽这么说,有几种方法可以完成你想要的。您可以简单地使用 ItemsControl 并使用您自己的模板覆盖模板。您还可以创建一个继承自 ItemsControl 或 Decorator 的 CustomControl。

覆盖模板(作为一种样式)将是更简单的方法,所以我的建议是这样做,除非您非常精通如何正确地.

如果您选择使用自定义控件,看起来您可能想要作为装饰者这样做(只是猜测您想要一个单独的 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/

相关文章:

c# - ActivityIndi​​cator 未在绑定(bind)到 ViewModel 的 XAML 中显示

c# - 为什么我的 ListView 看起来是空的?

wpf - WPF 样式中的绑定(bind)导致莫名其妙的 "Cannot find governing FrameworkElement"错误

c# - 具有 Asp.Net Core ViewComponents 的多个 Knockout View 模型

wpf - 来自 ICommand 的反馈

.net - 样式化嵌套 ListBox 的 ListBoxItem [WPF]

c# - 无法使用c#连接蓝牙设备

WPF + 使用 MVVM 的上下文菜单项的绑定(bind)命令和标题

c# - 如何将命令绑定(bind)到祖先数据上下文? WPF::MVVM

c# - WPF中UncommonField<T>的使用