4

このデータ グリッドでは、 を使用しItemTemplateSelectorて、特定のセルにバインドされたデータに基づいて 2 つのデータ テンプレートを切り替えています。

AutoGenerateColumns列の数は、で使用している現在のデータセットによって異なりますDataGrid

この特定の組み合わせはうまく機能しない
ようです。テンプレート セレクターは呼び出されません。

列が自動的に作成されるデータ グリッドでテンプレート セレクターを使用できますか?

より具体的には、コード ビハインド ファイルにロジックを入れたり、カスタム動作を使用したりせずに、 XAML のみを使用してこれを行うことは可能ですか?

データグリッドの定義はかなり簡単です。

 <DataGrid
     ItemTemplateSelector="{StaticResource myCustomDataTemplateSelector}"
     ItemsSource="{Binding MyData}">
     <DataGrid.Columns>
     </DataGrid.Columns>
 </DataGrid>

項目テンプレート セレクターの定義:

<UserControl.Resources>
    <ResourceDictionary>
        <helpers:CustomDataTemplateSelector x:Key="myCustomDataTemplateSelector"/>
    </ResourceDictionary>
</UserControl.Resources>
4

2 に答える 2

6

初め、

ItemTemplate と ItemTemplateSelector は継承されたプロパティであり、ItemsControl で意図されていた方法で実際には DataGrid に適用されないため、DataGrid では意図的に無視されます。

CellTemplateSelector第 2 に、値に基づいてセル テンプレートを変更する場合は、を探していますDataGridTemplateColumn

ただし、列を自動生成すると、基になる型が自動的に選択されます。

GeneratingColumnsイベントでその動作をオーバーライドできます。

これを参照してください: WPF DataGrid の自動生成された列で、CellTemplateSelector を使用して DataTemplateCell を強制します。

さらに制御が必要な場合は、https://zamjad.wordpress.com/2011/09/17/datagrid-with-dynamic-columns-revisited/をご覧ください。

于 2014-12-29T12:06:46.363 に答える
0

私は最近この問題に遭遇し、この方法で解決しました:

クラスを継承できますDataGridBoundColumn

public class DataGridProcessContainerColumn : DataGridBoundColumn
{
    public DataTemplate ContentTemplate { get; set; }

    protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
    {
        throw new NotImplementedException();
    }

    protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
    {
        var control = new ContentControl();
        control.ContentTemplate = ContentTemplate;
        BindingOperations.SetBinding(control, ContentControl.ContentProperty, Binding);
        return control;
    }
}

次に、列が生成されるイベント ハンドラーで、次のようにします。

private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    DataTemplate template = null;

    // Four lines below replace the DataTemplateSelector
    // You need to select the desired template according to your conditions
    if (e.PropertyType.IsAssignableFrom(typeof(IEnumerable<MyClass2>)))
        template = (DataTemplate)Resources["MyClass2CollectionTemplate"];
    else if (e.PropertyType.IsAssignableFrom(typeof(MyClass2)))
        template = (DataTemplate)Resources["MyClass2Template"];

    if (template != null)
    {
        var col = new DataGridProcessContainerColumn();
        col.Binding = (e.Column as DataGridBoundColumn).Binding;
        col.ContentTemplate = template;
        col.Header = e.Column.Header;
        e.Column = col;
    }
}

ウィンドウのリソースには、対応するテンプレートがあります。

DataTemplateSelector を介して行うことは可能ですが、時間がありませんでした。

于 2017-12-28T02:09:16.270 に答える