【问题标题】:How can I change a wpf Databound grid cell based on the cell value?如何根据单元格值更改 wpf 数据绑定网格单元格?
【发布时间】:2015-03-22 19:54:31
【问题描述】:

我对 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 事件,但是,当尝试使用非常流行的数据网格帮助程序扩展“DataGridHelper”时,我在 GetCell 方法中得到了 NullReferenceException:

presenter = GetVisualChild<DataGridCellsPresenter>(row);

行值正确,但presenter值为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;
    }

目前不知道该去哪里,并在整个网络上搜索了答案。非常感谢任何帮助

【问题讨论】:

    标签: c# wpf datagrid loaded


    【解决方案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}}"
    

    【讨论】:

    • 谢谢你帮我做的。感谢您对此提供的帮助。
    猜你喜欢
    • 1970-01-01
    • 2021-10-10
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    • 2013-11-23
    相关资源
    最近更新 更多