Nano Hash - криптовалюты, майнинг, программирование

Как сделать свойство command кнопки wpf свойством зависимости пользовательского элемента управления

Я пытаюсь научиться основам создания пользовательских элементов управления в wpf. С этой целью я экспериментировал с созданием элемента управления навигацией по данным, позволяющего перемещаться по записям, извлекаемым различными моделями представления. Мой долгосрочный план заключается в создании полностью автономного настраиваемого элемента управления, но я хотел бы сначала освоить более мелкие моменты, поэтому с этой целью я хотел бы знать, как я могу создать свойства Command и Command Parameter (а также Is Enabled) кнопок, которые являются частью моих свойств зависимостей пользовательского элемента управления для самого пользовательского элемента управления.

Мне удалось создать различные свойства изображения и высоты и ширины изображения для различных свойств зависимостей кнопок общего пользовательского элемента управления, но до сих пор не добился успеха с параметрами Command, Command Parameter и Enabled.

Буду рад любым предложениям.

У меня уже есть следующее (я установил для каждой кнопки в моем пользовательском элементе управления):

#Region "Next Button"
Public Property ImageNext() As ImageSource
    Get
        Return DirectCast(GetValue(ImageNextProperty), ImageSource)
    End Get
    Set(value As ImageSource)
        SetValue(ImageNextProperty, value)
    End Set
End Property


Public Shared ReadOnly ImageNextProperty As DependencyProperty = DependencyProperty.Register("ImageNext", GetType(ImageSource), GetType(DataNavigator), New UIPropertyMetadata(Nothing))

Public Property ImageNextWidth() As Double
    Get
        Return CDbl(GetValue(ImageNextWidthProperty))
    End Get
    Set(value As Double)
        SetValue(ImageNextWidthProperty, value)
    End Set
End Property


Public Shared ReadOnly ImageNextWidthProperty As DependencyProperty = DependencyProperty.Register("ImageNextWidth", GetType(Double), GetType(DataNavigator), New UIPropertyMetadata(16.0))

Public Property ImageNextHeight() As Double
    Get
        Return CDbl(GetValue(ImageNextHeightProperty))
    End Get
    Set(value As Double)
        SetValue(ImageNextHeightProperty, value)
    End Set
End Property


    Public Shared ReadOnly ImageNextHeightProperty As DependencyProperty = DependencyProperty.Register("ImageNextHeight", GetType(Double), GetType(DataNavigator), New UIPropertyMetadata(16.0))

Однако это добавляло свойства к стандартным кнопкам wpf, теперь я хочу получить доступ к свойствам тех кнопок, которые уже существуют, и привязать к ним (через мой пользовательский элемент управления) из моих моделей просмотра.

11.12.2014

Ответы:


1

Это то же самое, что и любое другое свойство зависимостей. Вы объявляете DP так:

Public Shared ReadOnly ThisCommandProperty As DependencyProperty = _
    DependencyProperty.Register("ThisCommand", GetType(ICommand), _
           GetType(thiscontrol), Nothing)

Public Property ThisCommand As ICommand
    Get
        Return CType(GetValue(ThisCommandProperty), ICommand)
    End Get
    Set(ByVal value As ICommand)
        SetValue(ThisCommandProperty, value)
    End Set
End Property

и в XAML вашего пользовательского элемента управления:

<UserControl ...> 
    <Button Command={Binding ThisCommand} ... />
</UserControl>

Вы устанавливаете параметр таким же образом, но с типом object, и вы должны преобразовать его, чтобы в обработчике команд был правильный тип.

Когда вы используете UserControl, это выглядит так:

<local:thisControl ThisCommand={Binding whateverCommandYouWantToBindTo}, 
    ThisCommandParameter={Binding whateverParameterYouWant)>

На самом деле он такой же, как и любой другой DP, за исключением типа. Конечно, whateverCommandYouWantToBindTo тоже нужно настроить как ICommand.

Люди также могут сказать вам, что определять элементы управления пользователя - это плохо, и вместо этого использовать шаблоны, и это, вероятно, лучший подход в большинстве случаев. Но если вы хотите узнать о DP, я говорю: учитесь.

Вот пример, над которым я работал:

Public Shared ReadOnly EditButtonCommandProperty As DependencyProperty = _
    DependencyProperty.Register("EditButtonCommand", _
          GetType(ICommand), GetType(PersonListControl), Nothing)

Public Property EditButtonCommand As ICommand
    Get
        Return CType(GetValue(EditButtonCommandProperty), ICommand)
    End Get
    Set(ByVal value As ICommand)
        SetValue(EditButtonCommandProperty, value)
    End Set
End Property

Public Shared ReadOnly EditButtonCommandParameterProperty As DependencyProperty = _
    DependencyProperty.Register("EditButtonCommandParameter", GetType(Object), _
            GetType(PersonListControl), Nothing);

Public Property EditButtonCommandParameter As Object
    Get
        Return CType(GetValue(EditButtonCommandParameterProperty), Object)
    End Get
    Set(ByVal value As Object)
        SetValue(EditButtonCommandParameterProperty, value)
    End Set
End Property

И в UserControl XAML:

<StackPanel>
    <ListBox ... />
    <Button 
        ...
        Command="{Binding EditButtonCommand}"
        CommandParameter="{Binding EditButtonCommandParameter}"/>
</StackPanel>

И я использую этот UserControl вот так:

<local:PersonListControl
    ...
    EditButtonCommand="{Binding PersonListEditCommand}"
    EditButtonCommandParameter="{Binding Parents}"/>
21.09.2015
  • Натан, это было очень много редактирования! Перевод на VB _и исправление моей грамматики. Большое Вам спасибо :-) 22.09.2015
  • Я вижу, здесь есть ответ на тот же вопрос: stackoverflow.com/questions/2777452/ 22.09.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..