Привязка к свойствам элементов ItemsControl - PullRequest
0 голосов
/ 23 января 2012

Я ищу способ привязки свойства Button Text или IsEnabled, например, к свойству IsChecked в ItemsControl Вот мой упрощенный исходный код:

<StackPanel>
    <ItemsControl ItemsSource="{Binding Tasks}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Margin="10,0,10,0" Text="{Binding Name}"/>
                    <CheckBox IsChecked="{Binding InProgress}"/>
                    <CheckBox IsChecked="{Binding Done}"/>
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    <Button/>
</StackPanel>

Я бы хотел (например), если отмечены все флажки «Готово», чтобы установить для параметра «Текст кнопки» какое-либо значение или включить его. Я думал сделать это с привязкой данных в Xaml с использованием DataTriggers, но я не знаю, как это сделать. Кто-нибудь может дать мне полное решение xaml?

Ответы [ 3 ]

1 голос
/ 23 января 2012

Новый ответ

Извините, я неправильно понял вопрос.Я бы выставил другое свойство из вашего DataContext, которое просто возвращает true / false, если все элементы в коллекции проверены или нет, и основал бы Text / IsEnabled вашей кнопки на этом свойстве, используя DataTrigger

<Style TargetType="{x:Type Button}">
    <Setter Property="IsEnabled" Value="False" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsAllChecked}" Value="True">
            <Setter Property="IsEnabled" Value="True" />
        </DataTrigger>
    </Style.Triggers>
</Style>

Старый ответ

DataTriggers просто принимают привязку и проверяют, равен ли результат некоторому значению.

<Style TargetType="{x:Type TextBox}">
    <Setter Property="IsEnabled" Value="False" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding Done}" Value="True">
            <Setter Property="IsEnabled" Value="True" />
        </DataTrigger>
    </Style.Triggers>
</Style>

Если вам нужно проверить более одного условия,вам нужно MultiDataTrigger

<Style TargetType="{x:Type TextBox}">
    <Setter Property="IsEnabled" Value="False" />
    <Style.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding Path=InProgress}" Value="True" />
                <Condition Binding="{Binding Path=Done}" Value="True" />
            </MultiDataTrigger.Conditions>
            <Setter Property="IsEnabled" Value="True" />
      </MultiDataTrigger>
    </Style.Triggers>
</Style>

Обратите внимание, что значение по умолчанию для setter является частью стиля.Это важно, потому что если вы установите значение по умолчанию для <TextBox>, тогда оно будет иметь более высокий приоритет, чем сработавшие значения, поэтому сработавшие значения не смогут изменить текущее значение.

0 голосов
/ 23 января 2012

Обычно лучший способ сделать это состоит в том, чтобы синтезировать состояние, которое вы хотите применить к вашей кнопке, в свойство вашей ViewModel.

В этом случае способ WPFy состоит в том, чтобы ваш ViewModel представил командукоторый реализует действие вашей кнопки.Команда по очереди может реагировать на изменения в ваших данных, сигнализировать о том, доступны они или нет, и, таким образом, автоматически отключает / включает вашу кнопку.Дополнительным бонусом является то, что вы можете легко реализовать, например, меню, которое будет правильно включено / отключено бесплатно, как только вы получите команду.

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

0 голосов
/ 23 января 2012

Вы можете изменить эту строку ...

<Button/>

К этому

<Button Content={Binding ButtonContent}/>

И установите свойство ButtonContent в ViewModel всякий раз, когда установлен флажок «Готово».

...