3

GridControlDevExpressから使用しようとしていますがListView、通常GridView 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 つの行が表示されます。データ自体はバインドされていますが、テンプレートが表示されていないようです。

この質問と同じアプローチを試みましたが、うまくいきません。私のクラスINotifyPropertyChangedObservableCollection<T>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>

このアプローチは と の両方ListViewで機能するようDataGridです。残念ながらGridControl動作が異なります。

使い方<dxg:GridColumn.EditSettings>は正しいですか?

4

3 に答える 3

3

より複雑な問題に発展します。

上記の編集で述べたようにTextEditSettings、その特定のケースで私が望んでいたことを行いました。しかし、コードを改善するとすぐに、いくつかのバグが現れ始めました。

その後に直面した問題は、公式の DevExpress フォーラムで言及されており、以下に要約しています。

本当の問題

私はいくつかのレポートに基本クラスを使用していましたが、それらのグリッドではそれらの派生クラスを使用していました。

質問で言及した解決策は、通常の nom 派生クラスで機能しますが、基本クラスと派生クラスのプロパティを使用し始めるとすぐに、奇妙な動作が発生し始めました。

TextEditSettingswithを使用するFieldNameことで、データをフォーマットし、派生クラスのプロパティの概要を表示できましたが、基本クラスのプロパティは機能しませんでした。

だから私はに変更し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で機能し、TextEditSettingsFieldNameは でGridColumnそのプロパティを取得するために使用されGridSummaryItemます。

于 2014-04-03T12:58:56.480 に答える
1

テキストをフォーマットする必要がありましたが、どうやらDevExpress GridControlはStringFormatをサポートしていません。さまざまな意図の後、フォーマットを管理することができました。

ObservableCollection を使用してグリッドにデータを入力します。列は次のとおりです。

価格、データ型 double、つまり: 15

シンボル、データ型文字列、つまり: US$

そして私が期待していたフォーマット: 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 の 2 つのフィールドがある場合、それらを再度バインドする必要はありません。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 に答える