2016-08-31 11 views
2

Я создал стиль для своего Expander элемента управления, который должен отключить расширитель, если он равен false, но он вообще не работает. Мой расширитель постоянно включен, независимо от того, является ли IsCheckedIn истинным или ложным.Невозможно отключить расширитель WPF со стилем

<Style x:Key="CollapseIsCheckedInExpander" TargetType="{x:Type Expander}"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding IsCheckedIn}" Value="False"> 
      <Setter Property="IsEnabled" Value="False"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

А вот где я устанавливаю стиль моего расширителя в моем DataGrid:

<Expander Expanded="Expander_Expanded" Collapsed="Expander_Expanded" Style="{DynamicResource CollapseIsCheckedInExpander}"/> 

У меня есть свойство кода позади, что называется «IsCheckedIn» и я установил значение верно или false в зависимости от того, зарегистрирован ли автомобиль, на котором я зарегистрировался, или нет.

Есть ли что-то, что мне не хватает?

EDIT:

Вот мой класс:

public class TruckItems : INotifyPropertyChanged 
{   
    bool _isCheckedIn; 
    public bool IsCheckedIn 
    { 
     get { return _isCheckedIn; } 
     set 
     { 
      if (_isCheckedIn != value) 
       _isCheckedIn = value; 
      OnPropertyChanged("IsCheckedIn"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    public void OnPropertyChanged(string propertyName) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    }   
} 

А вот пропущено, где я определяю мой IsCheckedIn:

truckItem.TruckCurrentPhase = item.CurrentPhase; //Current value is "Not Started", so the IsCheckedIn value should be false in the code below 
truckItem.IsCheckedIn = truckItem.TruckCurrentPhase == "Checked In" ? true : false; 

РЕШЕНИЕ

Я обнаружил, что моя проблема заключалась в использовании RowHeaderTempla т.е. По какой-то причине он не забрать мои привязок, но DataGridTemplateColumn сделал ...

Это не работает:

<DataGrid.RowHeaderTemplate> 
    <DataTemplate> 
     <Expander Expanded="Expander_Expanded" Collapsed="Expander_Expanded" Style="{StaticResource CollapseIsCheckedInExpander}"/> 
    </DataTemplate> 
</DataGrid.RowHeaderTemplate> 

Это делает работу:

<DataGridTemplateColumn> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <Expander Expanded="Expander_Expanded" Collapsed="Expander_Expanded" Style="{StaticResource CollapseIsCheckedInExpander}"/> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 
+0

почему вы не используете 'IsCheckedIn'binding не непосредственно в расширитель?! –

+0

@Motivated Я попытался: '', но он все равно включен все время. – CareTaker22

+2

, поскольку Фабиан рекомендовал использовать 'INotifyPropertyChanged' и проверяет, правильно ли установлен ваш DataContext –

ответ

1

Я создать простой пример (используя Caliburn Micro для привязки и уведомления ...). Он отлично работает для меня.

С этим вы можете проверить привязку просто. Задайте две точки останова во время работы приложения. Если вы меняете флажок, Breakpoint1 должен срабатывать, а Breakpoint2 должен срабатывать после этого (я думаю, что два раза, чтобы получить фактическое значение для CheckBox и фактическое значение для Expander IsEnabled). Если контрольные точки не срабатывают, вам нужно проверить свой DataContext (в вашем исходном коде DataContext должен быть truckItem не вашей ViewModel ... вы проверили это?).

XAML

<CheckBox IsChecked="{Binding ExpanderEnable, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">Enalble Expander</CheckBox> 
<Expander IsEnabled="{Binding ExpanderEnable, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"> 
    <TextBlock>TestText</TextBlock> 
</Expander> 

CS

private bool _expanderEnable; 

public bool ExpanderEnable { 
    get 
    { 
     return _expanderEnable; //Breakpoint2 
    } 
    set { 
     if (value == _expanderEnable) return; //BreakPoint1 
     _expanderEnable = value; 
     OnPropertyChanged(); 
    } 
} 

public event PropertyChangedEventHandler PropertyChanged; 

[NotifyPropertyChangedInvocator] 
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
{ 
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
} 
+0

Спасибо за ответ, но я все равно получаю те же результаты. Мой расширитель все еще включен. – CareTaker22

+0

Вы можете увидеть какие-либо проблемы с Binding в окне Output, принадлежащие IsCheckedIn, при запуске приложения? Это выглядело бы так: System.Windows.Data Error: 4: Не удалось найти источник для привязки со ссылкой или DataError 40 ... Вы пытались установить IsCheckedIn в конструкторе или значение по умолчанию как false? Он отключен при запуске? – WPFGermany

+0

Другое дело, что вы можете использовать стиль как StaticResource (нет необходимости в динамике в моем разуме). WPFGermany

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

  • Нет связанных вопросов^_^