2016-06-27 4 views
1

Я использую DataGrid в WPF для отображения значений. Теперь я хочу иметь зеленые и красные ряды. Я попробовал это с 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> 

The Binding тип:

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", поэтому триггеры никогда не срабатывали. Вы должны изменить ожидаемые значения ваших триггеров, чтобы отразить значения, Active может принимать (которые "Aktiv" и "Inaktiv"):

<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

Это действительно плохая идея:

Так вы установили Активный к «истинному» или «ложному», и вы вернетесь «Актив» или «Инактив»? Естественным результатом этого является то, что вы смешиваете себя с тем, что вы пишете триггер, предполагая, что Active.get вернет «true» или «false» вместо «Activ» или «Inaktiv». Вы можете исправить непосредственную проблему, просто установив атрибуты DataTrigger.Value, как предлагает Grx70, но в конечном итоге лучше исправить основную проблему и избежать вредных привычек, подобных этому. В частности, если вы намереваетесь работать в поле, вы действительно не хотите писать такие вещи. Active выглядит как простое свойство, но поведение - это то, чего никто никогда не ожидал бы, поэтому любой, кто взаимодействует с ним, будет застигнут врасплох, и тогда им придется прочитать код, чтобы выяснить, что он делает. Подумайте об этом так: когда вы увидите свойство в элементе управления WPF под названием IsEnabled, просто взглянув на имя свойства, вы точно знаете, что это значит, как его использовать и какой он тип. Это облегчает вашу жизнь.

Так вместо этого, я рекомендую вам сделать ваше логическое свойство фактическое булево:

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> 

Если вы тусклый, чтобы отобразить строки "Aktiv" и "Inaktiv" где-то в пользовательский интерфейс, вы можете сделать это с помощью другого триггера или с помощью свойства readonly, которое называется чем-то вроде ActiveDisplayString.

Возможно, вы должны использовать INotifyPropertyChanged в том, что OPCItem класс; Таким образом, вы можете изменить значения свойств после того, как они находятся в сетке, и пользовательский интерфейс будет отражать изменения.

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