Помощь с зарегистрированной зависимостью - PullRequest
2 голосов
/ 16 марта 2011

Я создал свой собственный элемент управления DataGrid, который наследуется от DataGrid. Я объявил свойство зависимости, которое я хочу использовать на уровне столбца, поэтому в событии PreviewKeyDown я проверяю значение и решаю, нужно ли обрабатывать эту текущую ячейку или нет.

public class MyDataGrid : DataGrid
{
    public static DependencyProperty HandleKeyPressEventProperty =
       DependencyProperty.RegisterAttached(
           "HandleKeyPressEvent",
           typeof(bool),
           typeof(MyDataGrid),
           new FrameworkPropertyMetadata(true));

    public bool HandleKeyPressEvent
    {
        get { return (bool)GetValue(HandleKeyPressEventProperty); }
        set { SetValue(HandleKeyPressEventProperty, value); }
    }

    protected override void OnPreviewKeyDown(KeyEventArgs e)
    {
        if (HandleKeyPressEvent)
        {
            HandleKeyPress(e);
        }
        else
        {
            base.OnPreviewKeyDown(e);
        }
    }
}

Мой XAML выглядит так:

<MyDataGrid x:Name="myDataGrid">
   <DataGridTextColumn MyDataGrid.HandleKeyPressEvent = "True" />
   <DataGridTemplateColumn MyDataGrid.HandleKeyPressEvent = "False"/>
</MyDataGrid>

Но у меня реальная проблема с доступностью этого свойства зависимости на уровне столбца. То, что я пытаюсь сделать, так же, как Grid.Column. Может ли кто-нибудь помочь мне с этим?

1 Ответ

4 голосов
/ 16 марта 2011

Присоединенное свойство имеет статический метод Get и статический метод Set (которые объявляются именем свойства с префиксом Get / Set) вместо оболочки свойства CLR.Чтобы проверить текущий столбец в OnPreviewKeyDown, вы можете использовать CurrentCell.Column

public class MyDataGrid : DataGrid
{
    public static readonly DependencyProperty HandleKeyPressEventProperty =
        DependencyProperty.RegisterAttached("HandleKeyPressEvent",
                                            typeof(bool),
                                            typeof(MyDataGrid),
                                            new UIPropertyMetadata(true));
    public static bool GetHandleKeyPressEvent(DependencyObject obj)
    {
        return (bool)obj.GetValue(HandleKeyPressEventProperty);
    }
    public static void SetHandleKeyPressEvent(DependencyObject obj, bool value)
    {
        obj.SetValue(HandleKeyPressEventProperty, value);
    }
    protected override void OnPreviewKeyDown(KeyEventArgs e)
    {
        if (GetHandleKeyPressEvent(CurrentCell.Column) == true)
        {
            HandleKeyPress(e);
        }
        else
        {
            base.OnPreviewKeyDown(e);
        }
    }
}
...