Как я могу выборочно установить “Видимость” TabItem через Привязку данных/Триггеры

Вы можете использовать упорядоченный словарь со значениями по умолчанию set. 1 Затем итерируйте свой список словарей, используя (number, favorite) в качестве ключей. Это работает, так как кортежи являются хэшируемыми и поэтому могут использоваться в качестве ключей словаря.

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

from collections import OrderedDict, defaultdict

class DefaultOrderedDict(OrderedDict):
    def __missing__(self, k):
        self[k] = set()
        return self[k]

d = DefaultOrderedDict()  # Python 3.7+: d = defaultdict(set)

for i in lst:
    d[(i['number'], i['favorite'])].add(i['color'])

res = [{'number': num, 'favorite': fav, 'color': col} for (num, fav), col in d.items()]

print(res)
# [{'color': {'green', 'red'}, 'favorite': False, 'number': 1},
#  {'color': {'red'}, 'favorite': True, 'number': 1},
#  {'color': {'red'}, 'favorite': False, 'number': 2}]

Если вы настаиваете на наличии разных типов в зависимости от количества цветов, вы можете переопределить понимание списка, чтобы использовать троичный оператор:

res = [{'number': num, 'favorite': fav, 'color': next(iter(col)) if len(col) == 1 else col} \
       for (num, fav), col in d.items()]

print(res)
# [{'color': {'green', 'red'}, 'favorite': False, 'number': 1},
#  {'color': 'red', 'favorite': True, 'number': 1},
#  {'color': 'red', 'favorite': False, 'number': 2}]

1 Этот момент заслуживает внимания в версиях Python до 3.7, где словари не гарантированно упорядочены по вставке. В Python 3.7+ вы можете воспользоваться порядком вставки и просто использовать dict или подкласс dict, например collections.defaultdict.

6
задан svick 19 March 2013 в 15:52
поделиться

2 ответа

Я полагаю, что Триггерный набор управления только в настоящее время поддерживает EventTriggers. Если требуется использовать DataTrigger, просто помещают его в стиле, для примера:

<TabItem Header="Blah">
    <TabItem.Style>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding BlahType}" Value="0">
                    <Setter Property="TabItem.Visibility" Value="Hidden" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TabItem.Style>
</TabItem>
13
ответ дан 8 December 2019 в 18:43
поделиться

Ну, Вы не можете сделать того использования триггеры (не, если Вы не в DataTemplate, ControlTemplate или Стиле).

Можно сделать это с помощью привязки, необходимо будет записать пользовательский ValueConverter, который переведет между 0/1 в Видимый/скрытый, и затем можно связать свойство Visibility со свойством BlhaType.

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

0
ответ дан 8 December 2019 в 18:43
поделиться
Другие вопросы по тегам:

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