[英]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属性FieldModifier
为public
,以便在另一个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属性FieldModifier
为public
是不够的?
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.