2012-01-23 4 views
0

Я ищу способ связать Button Text или IsEnabled свойство, например, к IsChecked собственности в ItemsControl Вот мой упрощенный исходный код:Привязка к Items свойств 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> 

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

+0

XAML, который вы предоставили, выглядит хорошо, в чем проблема? – sll

+1

Вам может потребоваться MultiTrigger для проверки нескольких условий. – NestorArturo

ответ

0

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

<Button/> 

Для этого

<Button Content={Binding ButtonContent}/> 

и установить свойство 'ButtonContent' в вашем ViewModel всякий раз, когда ваша 'Готово' флажок получает чек.

+0

Спасибо, Гэри, я искал полное решение Xaml для этого.Кажется, это так легко сделать с Data Binding и DataTriggers, но я думаю, что я ошибаюсь, и нет никакого способа сделать это, не возвращаясь к ViewModel. –

0

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

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

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

1

Новый ответ

К сожалению, я не понял вопрос. Я разоблачу другое свойство от вашего DataContext, что просто возвращает истину/ложь, если все элементы в коллекции проверяются или нет, и основываю ваша кнопка 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> 

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

+0

Спасибо, Рейчел за этот ответ, но я думаю, что меня не поняли. На самом деле InProgress и Done являются свойствами класса Task, связанного с itemsSource моего ItemsControl. Я не понимаю ваше решение в этом случае ... MultiDataTrigger привязан к свойствам этого элемента в списке? –

+1

@ AnisB.R Вы правы, я неправильно понял вопрос. Я бы выставил другое свойство из вашего DataContext, которое просто возвращает true/false, если все элементы в коллекции проверены или нет, и основывайте текст Button/Enabled на этом свойстве с помощью DataTrigger – Rachel

+0

+1 для упоминания иерархии! –

Смежные вопросы