简体   繁体   English

如何在XAML中公开控件

[英]How to Expose a Control in XAML

I'm new in WPF and I'm creating a control. 我是WPF的新手,我正在创建一个控件。 This control contains a DataGrid and some other WPF controls. 此控件包含DataGrid和一些其他WPF控件。

I created my Control as below: 我创建了我的控件如下:

<UserControl x:Class="MyControls.MyControl" 
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="329" d:DesignWidth="535" >
<Grid>
    <DataGrid Margin="6,25,6,35" Name="dataGrid" SelectionUnit="CellOrRowHeader" x:FieldModifier="public" HeadersVisibility="All"/>
    <OtherControl HorizontalAlignment="Left" x:Name="otherControl" Height="34" VerticalAlignment="Bottom" Width="523" x:FieldModifier="private"/>
    <Label Content="caption" Height="24" HorizontalAlignment="Left" Name="captionLabel" VerticalAlignment="Top" Foreground="#FF2626D1" x:FieldModifier="private"/>
</Grid>
</UserControl>

So, everything goes well so far, then I create a container UserControl which has in it my control created previously: 所以,到目前为止一切顺利,然后我创建了一个容器UserControl,其中包含我之前创建的控件:

<UserControl x:Class="MyContainers.MyContainer"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300" xmlns:my="clr-namespace:MyControls">
<Grid>
    <my:MyControl>

    </my:MyControl>
</Grid>

What I can not do is the following: 我不能做的是以下内容:

<my:MyControl>
    <my:MyControl.dataGrid>

    </my:MyControl.dataGrid>
</my:MyControl>

I previously set the datagrid's property of FieldModifier as public in order to get access to it in another xaml, but it raises an error from visual studio. 我之前将FieldModifier的datagrid属性FieldModifierpublic ,以便在另一个xaml中访问它,但它引发了visual studio的错误。

I need to "expose" my dataGrid in order to be able to add columns and their styles. 我需要“公开”我的dataGrid,以便能够添加列及其样式。

I would like to be able to do something like this: 我希望能够做到这样的事情:

<my:MyControl.dataGrid.Columns >
    <DataGridTextColumn />
    <DataGridTextColumn />
    ...
    <DataGridTextColumn />
</my:MyControl.dataGrid.Columns>

So, is not enough to set the datagrid's property of FieldModifier as public ? 那么,仅将FieldModifier的datagrid属性FieldModifierpublic是不够的?

Do I need to do something else? 我还需要做点什么吗? How can I achieve this? 我怎样才能做到这一点? Is this even possible? 这甚至可能吗?

I hope someone can help me. 我希望有一个人可以帮助我。 Thank you in advance. 先感谢您。

You cannot access the child DataGrid as MyControl.dataGrid -- MyControl has no property named "dataGrid". 您不能将子DataGrid作为MyControl.dataGrid访问 - MyControl没有名为“dataGrid”的属性。

You might try adding a dependency property of type ObservableCollection<DataGridColumn> to MyControl , and modify the dataGrid columns whenever that collection changes. 您可以尝试将类型为ObservableCollection<DataGridColumn>的依赖项属性添加到MyControl ,并在该集合发生更改时修改dataGrid列。

EDIT: Whipped together a quick example for you: 编辑:为您拼凑一个快速示例:

UserControl code: UserControl代码:

public partial class UserControl1 : UserControl
{
    public static readonly DependencyProperty ColumnsProperty = DependencyProperty.Register("Columns", typeof(ObservableCollection<DataGridColumn>), typeof(UserControl1));
    public ObservableCollection<DataGridColumn> Columns
    {
        get { return (ObservableCollection<DataGridColumn>)GetValue(ColumnsProperty); }
        set { SetValue(ColumnsProperty, value); }
    }


    public UserControl1()
    {
        Columns = new ObservableCollection<DataGridColumn>();
        Columns.CollectionChanged += (s, a) =>
            {
                dataGrid.Columns.Clear();
                foreach (var column in this.Columns)
                    dataGrid.Columns.Add(column);
            };
        InitializeComponent();
    }
}

UserControl xaml: UserControl xaml:

<UserControl x:Class="WpfApplication1.UserControl1"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008">
<Grid>
    <DataGrid x:Name="dataGrid" AutoGenerateColumns="False"/>
</Grid>

so you can use it like: 所以你可以使用它:

<Grid>
    <l:UserControl1>
        <l:UserControl1.Columns>
            <DataGridTextColumn Header="Col1"/>
            <DataGridTextColumn Header="Col2"/>
        </l:UserControl1.Columns>
    </l:UserControl1>
</Grid>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM