wpf - 如何在 XAML 中公开控件

标签 wpf xaml wpf-controls

我是 WPF 新手,正在创建一个控件。该控件包含一个 DataGrid 和一些其他 WPF 控件。

我创建的控件如下:

<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>

所以,到目前为止一切都很顺利,然后我创建一个容器 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>

我不能做的是:

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

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

我之前将数据网格的 FieldModifier 属性设置为 public,以便在另一个 xaml 中访问它,但它会从 Visual Studio 中引发错误。

我需要“公开”我的 dataGrid 以便能够添加列及其样式。

我希望能够做这样的事情:

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

那么,将数据网格的 FieldModifier 属性设置为 public 还不够吗?

我还需要做其他事情吗?我怎样才能实现这个目标?这可能吗?

我希望有人能帮助我。预先感谢您。

最佳答案

您无法访问子项 DataGridMyControl.dataGrid -- MyControl没有名为“dataGrid”的属性。

您可以尝试添加 ObservableCollection<DataGridColumn> 类型的依赖属性至MyControl ,并在该集合发生更改时修改 dataGrid 列。

编辑: 为您整理了一个简单的示例:

用户控制代码:

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();
    }
}

用户控件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>

所以你可以像这样使用它:

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

关于wpf - 如何在 XAML 中公开控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10952684/

相关文章:

c# - 使用 wpf webbrowser 控件导航到带有变音符号的 uri

c# - Xamarin。当前上下文中不存在名称“authorEntry”

c# - UWP Listview在绑定(bind)海量数据时变得很慢

c# - 如何将 ItemsControl.ItemsSource 与 XAML 中的属性绑定(bind)?

c# - DataGridTemplateColumn 绑定(bind)

c# - 如何延迟对列表中属性的调用?

c# - 以编程方式更改 WPF DataGrid 单元格背景(不使用 XAML)

c# - 在 wpf 和 C# 中制作自定义形状的按钮

c# - 如何获取WPF中任意控件的 "Content"?

c# - 获取 WPF 控件的当前大小