4

データグリッドの読み込み時に、WPFツールキットデータグリッドのDataGridComboBoxColumnを「公開」することはできますか?デフォルトでは、セルをクリックしてコンボボックスを表示する必要があります。セルをクリックしなくてもコンボボックスが使用できることをユーザーに確認してもらいたい。コンボボックスがすぐに利用可能になり、セルを最初にクリックすると、コンボボックスが実際にドロップダウンするようにしたいと思います。現在、セルをクリックしてから、コンボボックスのドロップダウンをクリックして値を表示する必要があります。

不要な外観

VS

正しい外観

XAML:

<dg:DataGridComboBoxColumn x:Name="ctrlStatus" Header="Status" Width="Auto" SelectedValueBinding="{Binding Port}" SelectedValuePath="Status">
  <dg:DataGridComboBoxColumn.CellStyle>
    <Style TargetType="dg:DataGridCell">
      <EventSetter Event="Selector.SelectionChanged" Handler="SelectionChanged"/>
    </Style>
  </dg:DataGridComboBoxColumn.CellStyle>
</dg:DataGridComboBoxColumn>

コードビハインド:

List<string> _statusList;
public List<string> StatusList
{
  get 
  {
      return _statusList; 
  }
  set
  {
    _statusList = value;
    ctrlStatus.ItemsSource = _statusList;
  }
}

ありがとう、GAR8

最終的な解決策:XAML

<telerik:GridViewComboBoxColumn Header="Status">
  <telerik:GridViewComboBoxColumn.CellTemplate>
    <DataTemplate>
      <telerik:RadComboBox ItemsSource="{Binding StatusList,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UserControl}}" SelectedValue="{Binding Port}" SelectedValuePath="Status" SelectionChanged="SelectionChanged"/>
    </DataTemplate>
  </telerik:GridViewComboBoxColumn.CellTemplate>
</telerik:GridViewComboBoxColumn>

コードビハインド:

List<string> _statusList;
public List<string> StatusList 
{
  get { return _statusList;  }
  set { _statusList = value; }
}
4

3 に答える 3

2

非編集テンプレートを指定せずに、 DataGridTemplateColumnを使用して、セル編集テンプレートとしてComboBoxを配置できます。これにより、DataGridは常にComboBoxを使用できるようになります。

更新
コメントで要求されたとおり、例を以下に示します。この例は最適ではなく、別の設計を選択したことに注意してください。ただし、大きな問題が発生することなくソリューションに統合できるように設計しました。私はそれをテストしていません。のエラーの場合はコメントしてください。

<DataGridTemplateColumn>    
     <DataGridTemplateColumn.CellEditingTemplate >       
           <DataTemplate>         
                 <ComboBox x:Name="ctrlStatus" 
                        SelectedValueBinding="{Binding Port}" 
                        SelectedValuePath="Status">  
                        SelectionChanged="SelectionChanged"
                        ItemsSource="{Binding StatusList,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}" 
                  />       
           </DataTemplate>    
     </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

上記のコードを使用するには、StatusListに変更通知を実装する必要があります。DataGridがaWindowになく、UserControlなどの別のクラスにある場合は、相対ソースのタイプ名を置き換えます。

于 2011-08-09T17:10:35.143 に答える
2

これを試して

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
       <DataTemplate>
           <ComboBox ItemsSource=”{Binding Path=YourSource...}” 
         Text=”{Binding Path=YourSource...}”/>
       </DataTemplate>
       </DataGridTemplateColumn.CellTemplate>
       <DataGridTemplateColumn.CellEditingTemplate >
       <DataTemplate>
         <ComboBox ItemsSource=”{Binding Path=YourSource...}” 
         Text=”{Binding Path=YourSource...}”/>
       </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

基本的に、CellTemplateとCellEditingTemplateの両方の場合にComboBoxを定義します。

少し前に書いたこの投稿を参照してください。セルの非編集(最初に表示)と編集(つまりコンボボックスをクリックすると表示)の状態用に別々のテンプレートを作成しました。これで、上記のXAMLで行ったように、非編集で編集コードをコピーでき、問題が解決されます。

于 2011-08-09T17:22:46.120 に答える
0

これを頻繁に使用する必要がある場合は、カスタム列を定義できます。

public class DataGridCustomComboBoxColumn : DataGridComboBoxColumn
{
    protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
    {
        return base.GenerateEditingElement(cell, dataItem);
    }
}

これは、通常の代わりに使用できますDataGridComboBoxColumn

于 2019-11-07T08:53:14.030 に答える