【问题标题】:WPF/DataGrid: Binding to different properties for displaying and editingWPF/DataGrid:绑定到不同的属性以进行显示和编辑
【发布时间】:2019-07-13 10:35:08
【问题描述】:

我有一个对象,它包含例如“10; 20; 30”之类的字符串属性。我还有一个 get 属性,它可以拆分字符串,将每个部分转换为双精度值并将它们相加。因此我有 "10; 20; 30" 和 60.0 (作为双倍)。

现在的问题是。有没有办法在 TextColumn 中显示 60.0(作为双精度),但是在进入编辑模式时编辑字符串“10; 20; 30”?

这样我就可以绑定到一个属性进行显示和绑定到另一个属性进行编辑?

【问题讨论】:

    标签: c# wpf datagrid datagridtextcolumn


    【解决方案1】:

    您可以通过使用不同的模板显示和编辑来实现您现有的属性本身。

    CellTemplateCellEditingTemplate 下面可以用于此。

    <Grid>
        <Grid.Resources>
            <local:ValueConverter x:Key="ValueConverter"/>
            <DataTemplate x:Key="DisplayTemplate" >
                <TextBlock Text="{Binding StringProperty, 
                                          Converter={StaticResource ValueConverter}}"/>
            </DataTemplate>
            <DataTemplate x:Key="EditTemplate">
                <TextBox Text="{Binding StringProperty}"  />
            </DataTemplate>
        </Grid.Resources>
        <DataGrid Name="DG1" ItemsSource="{Binding Items}" AutoGenerateColumns="False" 
                  CanUserAddRows="False">
            <DataGrid.Columns>
                <DataGridTemplateColumn Header="Total" 
                                        CellTemplate="{StaticResource DisplayTemplate}" 
                                        CellEditingTemplate="{StaticResource EditTemplate}" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
    

    您可以使用IValueConverter 将更新后的字符串值转换为double 根据您所需的计算。

    public class ValueConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            try
            {
                double total = 0.0d;
                foreach (var item in value.ToString().Split(';'))
                    total += System.Convert.ToDouble(item.Trim());
                return total;
            }
            catch
            {
                return 0.0d;
            }
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    

    注意:您可以在ValueConverter 类中为用户值添加必要的验证。

    【讨论】:

    • 是否可以修改默认 TextColumn 以具有不同的绑定,或者 DataGridTemplateColumn 是唯一的方法。我在问,因为我在后面的代码中创建了列,我正在寻找最简单和最短的方法。
    • @be_mi 不幸的是DataGridTextColumn 不支持任何类型的单元格模板。 CellTemplateCellEditingTemplate 都不是。你仍然可以从你的代码创建DataGridTemplateColumn
    猜你喜欢
    • 2011-04-13
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多