2016-08-31 24 views
2

Expanderコントロールのスタイルを作成しました。値がfalseの場合、エキスパンダーを無効にするはずですが、全く機能しません。 IsCheckedInがtrueまたはfalseであっても、エキスパンダーは常に有効です。スタイルで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> 

そして、ここで私は自分のデータグリッドで私のパンダのスタイルを設定する場所です:

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

私は「IsCheckedIn」プロパティコードビハインドことと呼ばれるていると私は真に値を設定しまたはに基づいて、私がチェックインしているトラックが既にチェックインされているかどうかに基づいています。

紛失しているものがありますか?私は私のIsCheckedInを定義し切り取ら

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)); 
    }   
} 

そして、ここでされています:

編集:ここでは

が私のクラスである

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を使用していたテ。何らかの理由で

これは動作しません...それは私のバインディングをピックアップしなかったが、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'とあなたの' DataContext'が正しく設定されているかどうかを確認してください –

答えて

1

(Caliburn Microを使用してバインディングと通知...)。それは私のためにうまく動作します。

これで簡単にバインディングをテストできます。アプリケーションの実行中に2つのブレークポイントを設定します。チェックボックスを変更するとBreakpoint1が起動し、その後Breakpoint2が起動するはずです(CheckBoxの実際の値とExpander IsEnabledの実際の値を取得するために2回考えます)。ブレークポイントが発生しない場合は、DataContextをチェックする必要があります(元のコードでは、DataContextは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が表示されますか? System.Windows.Dataエラー:4:参照またはDataError 40とのバインディングのソースを見つけることができません...コンストラクタでIsCheckedInを設定しようとしましたか、またはデフォルト値をfalseに設定しようとしましたか?それは起動時に無効になりますか? – WPFGermany

+0

別のことは、スタイルをStaticResourceとして使用できることです(私の心の中ではダイナミックの必要はありません)。 – WPFGermany

関連する問題