2016-01-28 17 views
0

我試圖隱藏DataGridRow s,條件是PrintQueue.Status != PrintQueueStatus.None,但我無法使其工作。PrinterQueueStatus到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>