2016-06-27 23 views
1

WPFでDataGridを使用して値を表示します。 今、私は緑色と赤色の列をしたいです。私はDataTriggerでそれを試しましたが、何も起こりません。WPF DataGridバインディングでスタイルを設定

私のXAML:

<DataGrid x:Name="dgAbos" ItemsSource="{Binding Source=AboList}" HorizontalAlignment="Stretch" Margin="10,30,10,10" VerticalAlignment="Stretch" Height="Auto" Width="Auto"> 
     <DataGrid.Columns> 
       <DataGridTextColumn Header="ItemID" Binding="{Binding ItemID}" /> 
     </DataGrid.Columns> 
     <DataGrid.RowStyle> 
      <Style TargetType="DataGridRow"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Active}" Value="false"> 
           <Setter Property="Background" Value="Red"></Setter> 
         </DataTrigger> 
         <DataTrigger Binding="{Binding Active}" Value="true"> 
           <Setter Property="Background" Value="Green"></Setter> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
     </DataGrid.RowStyle> 
</DataGrid> 

バインディングのタイプがある:

ObservableCollection<OPCItem> AboList = new ObservableCollection<OPCItem>(); 

して表示する項目があるOPCItem:

:私は、リストを埋める方法

class OPCItem 
{ 
    public String ItemID { get; set; } 

    public String Name { get; set; } 

    public String Value { get; set; } 

    public DateTime DateTime { get; set; } 

    public String Group { get; set; } 

    private Boolean _Active; 

    public String Active 
    { 
     get 
     { 
      return (_Active == true ? "Aktiv" : "Inaktiv"); 
     } 
     set 
     { 
      _Active = Convert.ToBoolean(value); 
     } 
    } 
} 

AboList.Add(new OPCItem { ItemID = Item.ItemID, Group = GroupName, Active = "true" }); 

しかし、行が色を変えない理由は何ですか?

答えて

3

Activeプロパティの値が決して"true"でも"false"でもないため、トリガーは実際にはトリガーされません。あなたは("Aktiv""Inaktiv"ある)Activeがかかる場合があります値を反映するために、あなたのトリガの期待値を変更する必要があります。

<DataTrigger Binding="{Binding Active}" Value="Inaktiv"> 
    <Setter Property="Background" Value="Red"></Setter> 
</DataTrigger> 
<DataTrigger Binding="{Binding Active}" Value="Aktiv"> 
    <Setter Property="Background" Value="Green"></Setter> 
</DataTrigger> 
+0

omg ...ありがとうございました。 – Phil795

2

これは本当に悪い考えです:

だから、あなたがアクティブに設定します「true」または「false」に変更し、「Aktiv」または「Inaktiv」に戻しますか?その自然な結果は、Active.getが "Activ"または "Inaktiv"の代わりに "true"または "false"を返すと仮定して、トリガーを書くポイントにあなた自身を混同します。 Grx70が示唆しているようにDataTrigger.Valueの属性を修正するだけで直ちに問題を解決できますが、根本的な問題を修正し、このような悪い習慣を避ける方が長期的には優れています。特にあなたがフィールドで働くつもりなら、あなたは本当にこの種のものを書いていることは望ましくありません。 Activeは単純なプロパティのように見えますが、その動作は誰も期待していたものではないので、誰かとやりとりする人は驚きを感じるでしょうし、それを理解するためにコードを読む必要があります。 WPFコントロールのプロパティーがIsEnabledと表示されたら、プロパティー名を調べるだけで、その意味、使用方法、タイプなどを正確に知ることができます。それはあなたの人生を楽にします。

はので、代わりに、私はあなたのboolean型プロパティの実際のブール作るお勧めします。

private bool _isActive; 
public bool IsActive { 
    get { return _isActive; } 
    set { _isActive = value; } 
} 

XAML:

<Style.Triggers> 
    <DataTrigger Binding="{Binding IsActive}" Value="false"> 
     <Setter Property="Background" Value="Red"></Setter> 
    </DataTrigger> 
    <DataTrigger Binding="{Binding IsActive}" Value="true"> 
     <Setter Property="Background" Value="Green"></Setter> 
    </DataTrigger> 
</Style.Triggers> 

あなたがどこかにある文字列 "アクティヴ" と "Inaktiv" を表示するワン場合あなたは別のトリガー、またはActiveDisplayStringのようなreadonlyプロパティでそれを行うことができます。

OPCItemクラスにはINotifyPropertyChangedも実装しているはずです。そうすることで、プロパティ値がグリッドに入った後にプロパティ値を変更することができ、UIに変更が反映されます。

関連する問題