2016-08-31 27 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根據我檢查的卡車是否已經簽入或不籤。

有什麼我失蹤了嗎?

編輯:

這裏是我的類:

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; 

SOLUTION

我發現,我的問題是使用RowHeaderTempla TE。出於某種原因,它沒有拿起我的綁定,但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

作爲Fabian推薦使用'INotifyPropertyChanged'並且alwas檢查您的'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

當你啓動你的應用程序時,你能看到屬於IsCheckedIn的輸出窗口中的任何Bindingproblems?它看起來像llike:System.Windows.Data錯誤:4:找不到與引用或DataError 40綁定的源...您是否嘗試在構造函數中設置IsCheckedIn或將默認值設置爲false?它在啓動時是否被禁用? – WPFGermany

+0

另一件事是你可以使用Style作爲StaticResource(在我的腦海裏不需要動態)。 WPFGermany