我在整个应用程序中使用了一个网格控件。我想扩展网格控件以包含一个上下文菜单,其中包含一个项目“冻结/解冻列”。如果我选择使用自定义控件,我无法在控件中实现此功能 - 相反,我必须在我放置自定义控件的任何地方实现该功能。另一种选择是用户控制,我可以在控件中实现所有必要的功能:
<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属性?任何帮助/建议将不胜感激。
答案 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; }
}