Установите флажок «Все» в XAML, используя триггер? - PullRequest
3 голосов
/ 14 мая 2009

Я бы хотел установить флажок выбора всех в xaml.
У меня есть несколько (шаблонных) флажков в виде списка. Затем у меня есть флажок за пределами списка, который я хочу иметь «выбрать все» - поведение. Я мог бы легко решить проблему в моей ViewModel, однако, я думаю, что было бы более элегантно сделать это в xaml, поскольку флажок select all (напрямую) не имеет никакого отношения к моей ViewModel. Код выглядит примерно так:

<ListView>
    <ListView.ItemTemplate>
        <DataTemplate>
        <CheckBox Content="Globale Eingabe"
            Name="SelectSingle"
            IsChecked="{Binding IsChecked}">
        </CheckBox>
    </DataTemplate>
<ListView.ItemTemplate>  
</ListView>
<CheckBox Name="SelectAll" />

Как видите, свойство IsChecked объекта SelectSingle уже привязано к моей модели представления. Поэтому я считаю, что мне нужен триггер для манипулирования состоянием флажка.

Теперь я уже попробовал вот что:

<CheckBox Content="Globale Eingabe"
    Name="SelectSingle"
    IsChecked="{Binding IsChecked}">
    <CheckBox.Triggers>
        <Trigger SourceName="SelectAll" Property="IsChecked" Value="True">
            <Setter TargetName="SelectSingle"  Property="IsChecked" Value="True"/>
        </Trigger>
    </CheckBox.Triggers>
</CheckBox>

или что-то вроде этого:

<CheckBox Content="Globale Eingabe"
    Name="SelectSingle"
    IsChecked="{Binding IsChecked}">
    <CheckBox.Triggers>
        <DataTrigger Binding="{Binding ElementName=SelectAll, Path=IsChecked}" 
            Value="True">
            <Setter TargetName="Check"
                Property="IsChecked"
                Value="True"/>
        </DataTrigger>
    </CheckBox.Triggers>
</CheckBox>

Я тоже пробовал то же самое в стиле, но безрезультатно. Я всегда получаю сообщение об ошибке, что по типу «статического члена» IsCheckedProperty не удается найти в типе «ContentPresenter» ».

Теперь это звучит так, как будто привязка Target / SourceName не будет работать, но почему? Я что-то упускаю?

Ответы [ 2 ]

3 голосов
/ 09 октября 2011

Я думаю, что вы должны поставить логику Check All в ViewModel в конце концов. В этой статье Code Project WPF Guro Josh Smith решает аналогичную проблему (в его случае это TreeView, а не ListView) в ViewModel со следующим заголовком: «Помещение смартов в ViewModel ".
Я думаю, что было бы проще реализовать и отладить эту логику во ViewModel, чем делать некоторые сложные MultiBinding, чтобы вы не знали, куда это вас укусит.
Последнее замечание - я бы всегда следовал совету Джоша: -)

0 голосов
/ 14 мая 2009

Торстен, извините, если я не понял, что вы уже пробовали, но вам нужно связать свойство IsChecked CheckBoxes внутри ListView со свойством IsChecked CheckBox вне его, используя:

IsChecked="{Binding Path=IsChecked, Mode=OneWay,ElementName=OutsideCheckBox}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...