Как связать свойство с флажком в DataGrid?

Помимо всех удивительных ответов здесь есть способ использовать getattr, чтобы сэкономить обильные строки кода и сохранить его уютно. Эта мысль возникла после ужасного представления кода, который иногда может быть необходим.

Сценарий

Предположим, что ваша структура каталогов выглядит следующим образом:

- superheroes.py
- properties.py

И , у вас есть функции для получения информации о Thor, Iron Man, Doctor Strange в superheroes.py. Вы очень хорошо записываете свойства всех из них в properties.py в компактном dict, а затем получаете к ним доступ.

properties.py

thor = {
    'about': 'Asgardian god of thunder',
    'weapon': 'Mjolnir',
    'powers': ['invulnerability', 'keen senses', 'vortex breath'], # and many more
}
iron_man = {
    'about': 'A wealthy American business magnate, playboy, and ingenious scientist',
    'weapon': 'Armor',
    'powers': ['intellect', 'armor suit', 'interface with wireless connections', 'money'],
}
doctor_strange = {
    'about': ' primary protector of Earth against magical and mystical threats',
    'weapon': 'Magic',
    'powers': ['magic', 'intellect', 'martial arts'],
}

Теперь, скажем, вы хотите вернуть возможности каждого из них по запросу в superheroes.py. Таким образом, есть функции, такие как

from .properties import thor, iron_man, doctor_strange


def get_thor_weapon():
    return thor['weapon']


def get_iron_man_bio():
    return iron_man['about']


def get_thor_powers():
    return thor['powers']

... и другие функции, возвращающие разные значения на основе ключей и супергероя.

С помощью getattr вы можете сделать что-то вроде:

from . import properties


def get_superhero_weapon(hero):
    superhero = getattr(properties, hero)
    return superhero['weapon']


def get_superhero_powers(hero):
    superhero = getattr(properties, hero)
    return superhero['powers']

Вы значительно сократили количество строк кода, функций и повторений!

О, и, конечно, если у вас есть плохие имена, такие как properties_of_thor для переменных , они могут быть сделаны и доступны, просто выполняя

def get_superhero_weapon(hero):
    superhero = 'properties_of_{}'.format(hero)
    all_properties = getattr(properties, superhero)
    return all_properties['weapon']

ПРИМЕЧАНИЕ. Для этой конкретной проблемы могут быть более разумные способы справиться с ситуацией, но идея состоит в том, чтобы дать представление об использовании getattr в правильных местах, чтобы писать более чистый код.

0
задан shreeya 13 July 2018 в 20:35
поделиться

1 ответ

Установите для привязки UpdateSourceTrigger значение PropertyChanged (и обратите внимание, что Mode="TwoWay" является избыточным, поскольку это значение по умолчанию для этого свойства):

<CheckBox IsChecked="{Binding Select, UpdateSourceTrigger=PropertyChanged}" />

Не знаете, почему это необходимо , поскольку значение DefaultUpdateSourceTrigger свойства FrameworkPropertyMetadata свойства зависимостей CheckBox.IsCheckedProperty уже PropertyChanged.

0
ответ дан Clemens 17 August 2018 в 12:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: