Как я могу изменить ячейку сетки данных wpf на основе значения ячейки?

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

<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);

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

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}}"
Другие вопросы по тегам