2016-08-11 2 views

ответ

0

Да, это возможно. Я сделал что-то подобное с ListView, который по сути является одним и тем же элементом управления. Хитрость здесь состоит в том, чтобы сделать это FAST. Это не должно занимать 30 секунд или что-то еще, если у вас есть тысячи предметов.

Теперь, как вы его реализуете, зависит, хотите ли вы создать общий элемент управления или конкретно для этого типа объекта. Причина в том, что для этого быстро, вам нужно знать, какое свойство объекта item является IsChecked. В моем контроле я создал DP под названием IsCheckedPath, так что это в духе WPF. Затем элемент управления автоматически привяжет свойство IsCheckedPath каждого объекта к соответствующему флажку.

Когда переключатель главного переключателя переключен, вам необходимо пройти через Элементы и установить значение свойства. У вас есть 2 варианта: 1) отражение или 2) скомпилировать дерево выражений при установке IsCheckedPath DP.

Я сделал # 2, так как отражение будет слишком медленным.

Если вы заботитесь об этом конкретном объекте и не думаете, что когда-либо будете использовать его, вы можете пропустить оба и просто установить свойство. Не очень хорошая идея ИМО, я бы пошел на общий маршрут :).

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

0

Здравствуйте, добро пожаловать в WPF! Для этой ситуации, похоже, что MultiBinding - это то, что вы ищете. Поскольку основной флажок может изменять отдельные флажки и наоборот, привязка должна быть двусторонней. MultiBinding будет применяться к флажку мастер, как это:

<Checkbox x:Name="MasterCheckBox"> 
<Checkbox.IsChecked> 
    <MultiBinding Converter="[Instance of your converter class]" Mode="TwoWay"> 
     <Binding Source="ConversationViewModel.ConversationValues" Convert="{StaticResource PersonFilterTypeToBoolConverter}" ConverterParameter="{x:Static shared:MethodType.Mobile}"/> 
     <Binding Source="ConversationViewModel.ConversationValues" Convert="{StaticResource PersonFilterTypeToBoolConverter}" ConverterParameter="{x:Static shared:MethodType.Skype}"/> 
     <Binding Source="ConversationViewModel.ConversationValues" Convert="{StaticResource PersonFilterTypeToBoolConverter}" ConverterParameter="{x:Static shared:MethodType.Landline}"/> 
    </MultiBinding> 
</Checkbox.IsChecked> 

Вам нужно будет также создать конвертер. Статья, связанная выше, описывает, как сделать простой конвертер. В вашем случае, поскольку привязка является двусторонней, вам необходимо обрабатывать как методы Convert, так и ConvertBack. Метод ConvertBack запускается, когда пользовательский флажок мастера изменяется, поэтому ему необходимо установить все привязки под мультисвязкой в ​​true или false. Метод Convert выполняется при изменении одного из отдельных флажков. В этом случае в WPF правильно установить флажок IsChecked of the master в true, если ВСЕ отдельные ящики отмечены, false, если ВСЕ отдельные ящики не отмечены, а если они смешаны, IsChecked должен быть нулевым. IsChecked может быть null, потому что тип этого свойства - bool? (nullable bool), так как флажки трех состояний работают в WPF.

+0

Это не исправить мою проблему, я сузил ее до IValueConverter, но я не уверен, как исправить это оттуда, теперь я добавлю IValueConverter. –