2015-03-22 3 views
1

Я относительно новичок в WPF и пытаюсь изменить некоторые ячейки сетки, где связанные значения являются десятичными нулями. Цель состоит в том, чтобы оставить ячейку пустой, где ячейка имеет 0. Например, если столбец TranDeposit имеет нули, я хотел бы изменить его на пробелы. В ASP.NET это очень возможно, используя событие DataBound. Код XAML следующим образом:
Как я могу изменить ячейку ячейки привязки wpf на основе значения ячейки?

<DataGrid x:Name="transactionsDataGrid" Grid.Row="3" AutoGenerateColumns="False" EnableRowVirtualization="True" 
        ItemsSource="{Binding}" RowDetailsVisibilityMode="VisibleWhenSelected" RowHeaderWidth="0" Padding="10,0,0,0" 
        AlternatingRowBackground="#FF888888" GridLinesVisibility="Horizontal" SelectionUnit="FullRow" RowBackground="#FFCCCCCC" VerticalAlignment="Top" SelectedIndex="0" 
        HeadersVisibility="Column" Background="#FF292929" Height="355" SelectionChanged="TransactionsDataGrid_SelectionChanged" CanUserAddRows="false" Margin="5,0,5,0" 
          Loaded="DataGrid_RowLoaded"> 

         <DataGrid.Columns> 
          <DataGridTextColumn x:Name="tranDateColumn" Binding="{Binding TranDate, StringFormat=MM/dd/yyyy}" Header="Date" Width="90" IsReadOnly="True"/> 
          <DataGridTextColumn x:Name="tranDescriptionColumn" Binding="{Binding TranDescription}" Header="Description" Width="*" IsReadOnly="True"/> 
          <DataGridTextColumn x:Name="tranCategoryColumn" Binding="{Binding TranCategory}" Header="Category" Width="340" IsReadOnly="True"> 
           <DataGridTextColumn.ElementStyle> 
            <Style TargetType="TextBlock"> 
             <!--<Setter Property="HorizontalAlignment" Value="Right" />--> 
             <Setter Property="ToolTip" Value="{Binding Path=TranCategory}"/> 
            </Style> 
           </DataGridTextColumn.ElementStyle> 
          </DataGridTextColumn> 
          <DataGridTextColumn x:Name="tranNotesColumn" Binding="{Binding TranNotes}" Header="Notes" Width="120" IsReadOnly="True"/> 
          <DataGridCheckBoxColumn x:Name="tranTaxColumn" Binding="{Binding TranTax}" Header="Tax" Width="SizeToHeader" IsReadOnly="True"/> 
          <DataGridCheckBoxColumn x:Name="tranClearedColumn" Binding="{Binding TranCleared}" Header="Cleared" Width="SizeToHeader" IsReadOnly="True" /> 
          <DataGridTextColumn x:Name="tranDepositColumn" Binding="{Binding TranDeposit}" Header="Deposit" Width="80" IsReadOnly="True"/> 
          <DataGridTextColumn x:Name="tranWithdrawlColumn" Binding="{Binding TranWithdrawl}" Header="Withdrawal" Width="80" IsReadOnly="True" /> 
          <DataGridTextColumn x:Name="tranBalanceColumn" Binding="{Binding TranBalance}" Header="Balance" Width="80" IsReadOnly="True"/> 
         </DataGrid.Columns> 
        </DataGrid> 

Как вы можете видеть, что я пытался использовать событие Loaded для доступа к ряду, однако, не существует ни одна строка доступна для динамического изменения для этого события. Я попытался это событие LoadingRow, однако, при попытке использовать очень популярный DataGrid помощник расширение «DataGridHelper», я получаю NullReferenceException в методе GetCell на линии:

presenter = GetVisualChild<DataGridCellsPresenter>(row); 

значение строки является правильным, но значение ведущего равно null.

public static DataGridCell GetCell(this DataGrid grid, DataGridRow row, int column) 
    { 
     if (row != null) 
     { 
      DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row); 
      if (presenter == null) 
      { 
       grid.ScrollIntoView(row, grid.Columns[column]); 
       presenter = GetVisualChild<DataGridCellsPresenter>(row); 
      } 

      DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column); 
      return cell; 
     } 
     return null; 
    } 

Не знаете, куда идти в этот момент и искали по всему Интернету ответы. Я бы очень признателен за любую помощь

ответ

1

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

public class ZeroToBlank: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value is int && (int)value == 0) 
      return string.Empty; 

     return value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (string.IsNullOrEmpty(value)) 
      return 0; 

     return value; 
    } 
} 

Вам нужно добавить ссылку на пространство имен в вашем XAML:

xmlns:converters="YourNamespace.Converters" 

Затем добавьте в качестве ресурса:

<UserControl.Resources> 
    <converters:ZeroToBlankConverter x:Key="ZeroToBlankConverter" /> 
</UserControl.Resources> 

И, наконец, в связывании:

Binding="{Binding TranDeposit, Converter={StaticResource ZeroToBlankConverter}}" 
+0

Спасибо, что сделал это для меня. Цените свою помощь по этому поводу. –

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