2

DataGridTemplate 列 ComboBox で選択した項目を保持する際に問題が発生しています。データグリッドの最初の列として DataTemplate の編集可能なコンボボックス列があり、その隣にテキスト列があります。DataGrid には、SQL ストアド プロシージャから読み取ったデータが入力されます。コンボボックスでアイテムを選択してテキストフィールドに移動し、入力を開始すると、コンボの選択が空白になることを除いて、すべて正常に機能します。新しいアイテムまたは既存のアイテムの両方を空白にします。奇妙なことに、これは最初の 1 回だけです。ComboBox 値を再選択するか、新しいアイテムを再度追加してテキスト フィールドに戻ると、空白になりません。私はアイデアが不足しており、多くの組み合わせを試しましたが、今のところうまくいきません. これが私のコードです:

これは、DataGrid にデータを入力する方法です。

using (SqlCommand cmd = new SqlCommand())
{
    cmd.CommandText = "GetProducts";
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Connection = sqlConn;

    var reader = cmd.ExecuteReader();
    var dt = new DataTable();
    dt.Load(reader);
    dt.Columns["ProductName"].AllowDBNull = true;
    dtProductCfgTable = dt;
    ProductCfgGrid.ItemsSource = dtProductCfgTable.DefaultView;
}

これは、ProductNamesList の宣言です。

public List<string> ProductNamesList { get; set; }

XAML:

<DataGridTemplateColumn Header="ProductName">
   <DataGridTemplateColumn.CellTemplate>
      <DataTemplate>
        <ComboBox ItemsSource="{Binding ProductNamesList, 
                                RelativeSource={RelativeSource AncestorType=Window}}"  
                                SelectedItem="{Binding ProductName 
                                IsSynchronizedWithCurrentItem="False"  
                                BorderThickness="1.2 1.2 0 0" BorderBrush="Black" 
                                Background="LightCyan" IsEditable="True" />
      </DataTemplate>
   </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>  
<DataGridTextColumn Binding="{Binding ShippingAddress}" 
                    Width="100" 
                    Header="ShippingAddress" 
                    Visibility="Visible"/>
4

1 に答える 1

7

データが失われる理由は、CellTemplate編集以外の機能しか提供しないためです。そのため、新しい行を編集するときにコンボボックスの値を変更するたびに、編集モードの実装がなかったため、データが設定されず、オブジェクトがありませんでした。舞台裏で作成されていました。DatagridTextColumn には自動的に編集が組み込まれているため、このタイプのセルを編集した後にコンボボックスが機能するのはそのためです。

<DataGridTemplateColumn Header="ProductName" >
     <DataGridTemplateColumn.CellTemplate>
         <DataTemplate>
                 <ComboBox ItemsSource="{Binding ProductNamesList, 
                 RelativeSource={RelativeSource AncestorType=Window}}" 
                 SelectedValue="{Binding ProductName, Mode=TwoWay}"
                 IsSynchronizedWithCurrentItem="False"
                 IsEditable="False"
                 IsHitTestVisible="False" />
         </DataTemplate>
     </DataGridTemplateColumn.CellTemplate>
     <DataGridTemplateColumn.CellEditingTemplate>
         <DataTemplate>
             <ComboBox ItemsSource="{Binding ProductNamesList, 
                 RelativeSource={RelativeSource AncestorType=Window}}" 
                 Text="{Binding ProductName, Mode=TwoWay}"
                 IsSynchronizedWithCurrentItem="False"
                 IsEditable="True" />
         </DataTemplate>
     </DataGridTemplateColumn.CellEditingTemplate>
 </DataGridTemplateColumn>

コンボボックスの冗長性は、非編集モードでユーザーにコンボボックスを表示させたい場合にのみ必要です。それを気にしない場合は、次のように書くだけです。

<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding ProductName}" />
    </DataTemplate>
 </DataGridTemplateColumn.CellTemplate>
于 2013-08-05T17:08:08.403 に答える