3

サーバーから取得した動的データ(カスタムDataRowsのコレクション)を含むDataGridがあります。DataRowには、インデクサーと、バインディングのデータ行全体を返すプロパティDataがあります(以下を参照)。

DataGridの各列を次のように作成します。

DataGridTextColumn column = new DataGridTextColumn();    
Binding binding = new Binding("Data[" + i.ToString() + "]");
binding.Mode = BindingMode.TwoWay;
binding.Converter = _dataContextSelector;
binding.ConverterParameter = dataColumn;
column.Binding = binding;

私がする必要があること:コンバーターが返すデータに応じて、さまざまな方法でDataGridCellsのコンテンツを表示する必要があります。
テンプレートセレクター(ContentControlを継承する)を作成し、次のようにDataGridCellのContentTemplateプロパティに配置しました。

<Style TargetType="sdk:DataGridCell">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <view:DataGridCellTemplateSelector Content="{Binding}" />
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

この場合、セレクターのコンテンツとしてDataRow全体があり(列が行の1つの項目にバインドされているため、理由がわかりません)、コンバーターは呼び出されません。データ行全体がデフォルトのDataContextであるため、この場合、コードビハインドバインディングは単に無視されていると思います。
そこで、テンプレートセレクターをDataGridCellのControlTemplateに配置しようとしました。

<Style TargetType="sdk:DataGridCell">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="sdk:DataGridCell">
                <view:DataGridCellTemplateSelector Content="{TemplateBinding Content}" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

しかし、この場合、セレクターのコンテンツとして空のテキストを含むTextBlockがあります(SHOCKED)。コンテンツが変更された後、コンバーターが呼び出されます。バインディングのデータに従ってテンプレートを選択するテンプレートセレクターを作成するにはどうすればよいですか(コンバーターが呼び出された後)?

4

1 に答える 1

0
  • カスタム テンプレート セレクターの代わりに暗黙的なデータ テンプレートを使用することを検討してください。
  • カスタム DataGridBoundColumn を作成し、GenerateElement をオーバーライドします。
  • GenerateElement で、ContentControl を返します。カスタム列の Binding プロパティを使用して、その ContentControl の Content プロパティをバインドする必要があります。
    • 暗黙的なデータ テンプレートを使用している場合は、この時点で完了です。
    • 独自の DataGridCellTemplateSelector を使用する場合は、上記のプレーンな ContentControl の代わりにそれを使用してください。

暗黙的なデータ テンプレートは次のようになります (x:Key のないリソースであることに注意してください)。

<UserControl.Resources>
    <DataTemplate DataType="ViewModel:Contact">
        <StackPanel>
            <TextBlock Text="{Binding Name}"/>
            <TextBlock Text="{Binding City}"/>
        </StackPanel>
    </DataTemplate>
</UserControl.Resources>
于 2012-12-14T13:21:43.103 に答える