3

我正在尝试GridControl从 DevExpress 使用,但我不能做我通常ListViewGridView View.

我做了两个方法。使用DisplayMemberBindingCellTemplate。两者都没有显示。下面的代码(我删除了一些列):

<dxg:GridControl ItemsSource="{Binding}" Name="gridControl1">
    <dxg:GridControl.Columns>
        <dxg:GridColumn Header="Teste" DisplayMemberBinding="{Binding DataNascimento}"/>
        <dxg:GridColumn Header="Nome">
            <dxg:GridColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Nome}"/>
                </DataTemplate>
            </dxg:GridColumn.CellTemplate>
        </dxg:GridColumn>
    </dxg:GridControl.Columns>
    <dxg:GridControl.View>
        <dxg:TableView Name="tableView1" AutoWidth="True" />
    </dxg:GridControl.View>
</dxg:GridControl>

如下图所示:

带有绑定数据但未显示任何内容的网格

你可以看到我的专栏,但没有数据。我绑定了 3 个项目,它显示了 3 行。数据本身已绑定,但看起来模板未显示。

我尝试了这个问题的相同方法,但对我不起作用。我的班级有INotifyPropertyChanged并且我使用了一个ObservableCollection<T>before bindind 到GridControl. 唯一可行的方法是,如果我删除几乎所有代码并将AutoPopulateColumns. True但在某些情况下,我想要一个自定义格式并且无法使用此选项实现。

Edit1: 我在设计模式下做了这个并且工作:

            <dxg:GridColumn FieldName="DataNascimento" Name="gridColumn3">
                <dxg:GridColumn.EditSettings>
                    <dxe:TextEditSettings DisplayFormat="{}{0:dd/MM/yyyy HH:mm:ss}" />
                </dxg:GridColumn.EditSettings>
            </dxg:GridColumn>

Edit2: 尝试了@blindmeis与网格相同的方法,它的工作方式与我预期的一样:

<DataGrid AutoGenerateColumns="False" Grid.Row="2" ItemsSource="{Binding}">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding DataNascimento}" Header="Nascimento" />
        <DataGridTextColumn Binding="{Binding Nome}" Header="Header" />
        <DataGridTemplateColumn Header="Teste">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding Nome}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

看起来这种方法适用于ListViewDataGrid。不幸的是GridControl表现不同。

使用<dxg:GridColumn.EditSettings>方法是否正确?

4

3 回答 3

3

它最终导致了一个更复杂的问题。

正如我在上面的编辑中提到的TextEditSettings那样,在这种特殊情况下做了我想要的。但是一旦我改进了代码,一些错误就开始出现。

之后我遇到的问题在官方DevExpress论坛中提到,我总结如下:

真正的问题

我为一些报告使用了基类,在这些网格中我使用了他们的派生类。

我在问题中提到的解决方案适用于常规的 nom 派生类,但是当我开始使用基类和派生类的属性时,一些奇怪的行为开始发生。

通过使用TextEditSettingswithFieldName我可以格式化数据并显示派生类中属性的摘要,但对于基类中的属性它不起作用。

所以我改为DisplayMemberBinding它适用于所有属性,但摘要停止工作。

解决方案

要使格式选项可用于您的类中的属性继承的属性并使摘要正常工作,您必须像这样使用:

旁注:不知道其中的所有这些属性TableView是否真的有必要,但由于此控件对它们的更改非常敏感,因此我将它们全部保留只是为了弄清楚什么对我有用。

<dxg:GridControl ItemsSource="{Binding MyObservableCollection}">
    <dxg:GridControl.Columns>
        <dxg:GridColumn DisplayMemberBinding="{Binding Percent}"
                        FieldName="Percent"
                        Header="%">
            <dxg:GridColumn.EditSettings>
                <dxe:TextEditSettings DisplayFormat="F2" />
            </dxg:GridColumn.EditSettings>
        </dxg:GridColumn>
    </dxg:GridControl.Columns>
    <dxg:GridControl.View>
        <dxg:TableView AllowSorting="False"
                       ShowTotalSummary="True"
                       FilterEditorShowOperandTypeIcon="True"
                       NavigationStyle="Row"
                       MultiSelectMode="None"
                       AllowColumnFiltering="False"
                       AllowDateTimeGroupIntervalMenu="False"
                       AllowEditing="False"
                       AllowFilterEditor="False"
                       AllowGrouping="False"
                       ClipboardCopyAllowed="False"
                       ShowGroupPanel="False" />
    </dxg:GridControl.View>
    <dxg:GridControl.TotalSummary>
        <dxg:GridSummaryItem FieldName="Percent"
                             DisplayFormat="F2"
                             SummaryType="Sum" />
    </dxg:GridControl.TotalSummary>
</dxg:GridControl>

在这种情况下,它将在Percent继承的属性中工作。将DisplayMemberBinding使其适用于 ,TextEditSettingsFieldNameinGridColumn用于使摘要获取该属性GridSummaryItem

于 2014-04-03T12:58:56.480 回答
1

我只是需要格式化文本,但显然 DevExpress GridControl 不支持 StringFormat。经过各种意图,我能够管理格式。

我使用 ObservableCollection 填充我的网格。这些列是:

价格,数据类型 double,即:15

符号,数据类型字符串,即:US$

和我期待的格式:15.00 美元

这是我通常使用常规 DataGrid 的方式

<DataGridTextColumn  Header="Price" IsReadOnly="True">
    <DataGridTextColumn.Binding>
        <MultiBinding StringFormat="{}{0} {1:#.00}">
            <Binding Path="Symbol" />
            <Binding Path="Price" />
        </MultiBinding>
    </DataGridTextColumn.Binding>
</DataGridTextColumn>

这是我的做法。请注意,在“绑定路径”中,该字段需要以数据开头。并且必须有RelativeSource="{RelativeSource Self}",否则它将不起作用。

<dxg:GridColumn Header="Price" FieldName="Price">
    <dxg:GridColumn.DisplayMemberBinding>
        <MultiBinding Converter="{StaticResource stringConcatenator}">
            <Binding Source="{}{0} {1:#.00}"/>                                                    
            <Binding Path="Data.Symbol" RelativeSource="{RelativeSource Self}" />
            <Binding Path="Data.Price" RelativeSource="{RelativeSource Self}"/>
        </MultiBinding>
    </dxg:GridColumn.DisplayMemberBinding>                                      
</dxg:GridColumn>

这里是转换器:

public class StringConcatenator : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        //the first parameter is the format, and the consequent parameters are the values
        return string.Format(values[0].ToString(), values.Skip(1).Take(values.Length - 1).ToArray());
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        return new string[] { };
    }
}
于 2014-06-20T21:10:43.687 回答
0

如果您将数据网格与视图模型中的可观察集合绑定,并且如果您的可观察集合将 DataNascimento 和 Nome 作为两个字段,那么您不必像以前那样再次绑定它们。您可以直接给出 fieldname,它将使用您可观察集合中的值填充列。

你可以这样做:

<DataGrid AutoGenerateColumns="False" Grid.Row="2" ItemsSource="{Binding YOUR_OBSERVABLE_COLLECTION}">
<DataGrid.Columns>
    <DataGridTextColumn FieldName="DataNascimento" Header="Nascimento" />
    <DataGridTextColumn FieldName="Nome" Header="Header" />
    <DataGridTemplateColumn Header="Teste">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBox Text="{Binding Nome}"/>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
</DataGrid.Columns>

于 2013-03-11T21:16:30.860 回答