2016-01-28 8 views
0

Я пытаюсь скрыть DataGridRow с условием, что PrintQueue.Status != PrintQueueStatus.None, но я не могу заставить его работать.PrinterQueueStatus to Visibility converter on DataGridRow

Вот что я пробовал:

XAML

<Window.Resources> 
<self:PrinterStatusToVisibilityConverter x:Key="PrinterStatusToVisibilityConverter" /> 
    </Window.Resources> 

<DataGrid RowDetailsVisibilityMode="Visible" AlternatingRowBackground="#E0E0E0" AlternationCount="2" CellStyle="{StaticResource BodyContentDataGridCentering }" Grid.Row="1" Name="dgPrinters" AutoGenerateColumns="False" RowHeight="50"> 
    <!--body content datagrid cell vertical centering--> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn Header="Überwachen" Width="Auto" CellStyle="{StaticResource BodyContentDataGridCentering}"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <CheckBox HorizontalAlignment="Center" IsChecked="{Binding Monitor, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
     <DataGridTextColumn Width="Auto" Header="Druckername" Binding="{Binding FullName, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True"/> 
     <DataGridTextColumn Width="Auto" Header="Freigabename" Binding="{Binding ShareName, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True"/> 
     <DataGridTextColumn Header="Portname" Binding="{Binding PortName, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True"/> 
     <DataGridTextColumn Header="Treibername" Binding="{Binding DriverName, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True"/> 
    </DataGrid.Columns> 

    <DataGrid.RowStyle> 
     <Style TargetType="{x:Type DataGridRow}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Status, Converter={StaticResource PrinterStatusToVisibilityConverter}}"> 
        <Setter Property="Visibility" Value="Hidden"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </DataGrid.RowStyle> 
</DataGrid> 

И мой код-за для преобразователя

public class PrinterStatusToVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if ((PrintQueueStatus) value != PrintQueueStatus.None) 
      return Visibility.Visible; 

     return Visibility.Hidden; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return PrintQueueStatus.None; 
    } 
} 

Так что я хочу знать, что я Неправильно? Я почти уверен, что неправильно понял конвертер. Может ли кто-нибудь объяснить мне мой пример? Это было бы круто.

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

ответ

1

Для этого вы можете использовать преобразователь значений или триггер, но вы их смешивали.

Используйте значение преобразователя:

<DataGrid.RowStyle> 
    <Style TargetType="{x:Type DataGridRow}">     
     <Setter Property="Visibility" Value="{Binding Status, Converter={StaticResource PrinterStatusToVisibilityConverter}}" /> 
    </Style> 
</DataGrid.RowStyle> 

или

Использование триггера, для перечисления PrintQueueStatus, сначала объявить пространство имен для System.Printing.

<Window x:Class="..." 
    xmlns:self="..." 
    xmlns:printing="clr-namespace:System.Printing;assembly=System.Printing"> 

Тогда

<DataGrid.RowStyle> 
     <Style TargetType="{x:Type DataGridRow}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Status}"> 
        <DataTrigger.Value> 
         <printing:PrintQueueStatus>None</printing:PrintQueueStatus> 
        </DataTrigger.Value> 
        <Setter Property="Visibility" Value="Hidden" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </DataGrid.RowStyle>