WPF用户与自定义控件

时间:2011-06-07 14:13:12

标签: wpf grid controls

我在整个应用程序中使用了一个网格控件。我想扩展网格控件以包含一个上下文菜单,其中包含一个项目“冻结/解冻列”。如果我选择使用自定义控件,我无法在控件中实现此功能 - 相反,我必须在我放置自定义控件的任何地方实现该功能。另一种选择是用户控制,我可以在控件中实现所有必要的功能:

<Grid>
    <dxg:GridControl Name="gridData" DataSource="{Binding}" dx:DXSerializer.StoreLayoutMode="All">
        <dxg:GridControl.Resources></dxg:GridControl.Resources>
        <dxg:GridControl.Columns />
        <dxg:GridControl.View>
            <dxg:TableView ShowGroupPanel="False" MouseRightButtonUp="TableView_MouseRightButtonUp">
                <dxg:TableView.ColumnMenuCustomizations>
                    <dxb:BarButtonItem  Name="freezeColButton" Content="Freeze Column(s)" dxb:BarItemLinkActionBase.ItemLinkIndex="0" ItemClick="freezeColButton_ItemClick" />
                </dxg:TableView.ColumnMenuCustomizations>
            </dxg:TableView>
        </dxg:GridControl.View>
    </dxg:GridControl>
</Grid>

请注意,TableView.ColumnMenuCustomization标记包含冻结/解冻功能的事件处理程序。

但是,用户控件的唯一问题是我无法访问底层Grid的Columns属性。例如,当我将用户控件(在上面定义)放在窗口中时,我收到错误(错误25:XML命名空间中的标签'ExtendedGridControl.Columns''clr-namespace:UI.Controls'):< / p>

<Window>
    ...
     <Grid>
        <uc:ExtendedGridControl x:Name="extendedGridData" >
            <uc:ExtendedGridControl.Columns>
                <dxg::GridColumn FieldName="FieldA" Visible="True" />
                ...
            </uc:ExtendedGridControl.Columns>
        </uc:ExtendedGridControl>
    </Grid
</Window>

如何公开GridControl属性?任何帮助/建议将不胜感激。

1 个答案:

答案 0 :(得分:4)

您需要通过在UserControl上定义属性来传播属性,例如

public partial class Bogus : UserControl
{
    // You often can reuse properties via DependencyProperty.AddOwner
    public static readonly DependencyProperty ItemsSourceProperty = ItemsControl.ItemsSourceProperty.AddOwner(typeof(Bogus));
    public IEnumerable ItemsSource
    {
        get { return (IEnumerable)GetValue(ItemsSourceProperty); }
        set { SetValue(ItemsSourceProperty, value); }
    }

    public static readonly DependencyProperty ItemTemplateProperty = ItemsControl.ItemTemplateProperty.AddOwner(typeof(Bogus));
    public DataTemplate ItemTemplate
    {
        get { return (DataTemplate)GetValue(ItemTemplateProperty); }
        set { SetValue(ItemTemplateProperty, value); }
    }

    public Bogus()
    {
        InitializeComponent();
    }
}
<UserControl x:Class="Test.UserControls.Bogus" 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" Name="control">
    <StackPanel>
        <TextBlock Text="Lorem Ipsum:" />
        <ItemsControl ItemsSource="{Binding ElementName=control, Path=ItemsSource}"
                ItemTemplate="{Binding ElementName=control, Path=ItemTemplate}" />
    </StackPanel>
</UserControl>

属性在外部可见,内部控件绑定到它们。

对于某些属性,您不使用DependencyProperty,而只是一个引用内部控件属性的clr属性,对于某些只有setter或内部构造函数或者内部控件中不是依赖属性的属性,这可能更好。 ,例如

public ItemCollection Items
{
    get { return _itemsControl.Items; }
}