Пользователь WPF и пользовательский элемент управления - PullRequest
2 голосов
/ 07 июня 2011

У меня есть элемент управления сеткой, который я использую во всем приложении.Я хотел бы расширить контроль сетки, чтобы включить контекстное меню с одним пунктом "замораживать / размораживать столбцы".Если я решу использовать пользовательский элемент управления, я не смогу реализовать эту функцию внутри элемента управления - вместо этого мне придется реализовывать эту функцию везде, где я размещаю свой пользовательский элемент управления.Другой альтернативой является пользовательский элемент управления, в котором я могу реализовать все необходимые функции в элементе управления:

<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: тег 'ExtendedGridControl.Columns' не существует в пространстве имен XML 'clr-namespace: UI.Controls'):

<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 Ответ

4 голосов
/ 07 июня 2011

Вам нужно распространять свойства, определяя их на 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, которое ссылается на свойство внутреннего элемента управления, это может быть предпочтительным для определенных свойств, которые имеют только сеттеры или внутренние конструкторы или не являются свойствами зависимостей во внутренних элементах управления. например,

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