ユーザーが WPF DataGrid (.net Framework 4.0 から) で一部のデータを編集できるようにしたいと考えています。「楽器」列では、ユーザーが静的リストから使用可能な楽器を選択したり、自由なテキストを書いたりできるようにする必要があります。私の DataGrid は、MVVM を使用してデータにバインドされています。インターネットで見つけた多くの解決策を試しましたが、どれも正しく機能しません。これが私のコードです:
<DataGrid Margin="0,6" ItemsSource="{Binding Path=Orders}" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeRows="True">
<DataGrid.Columns>
<DataGridComboBoxColumn Header="Instrument" MinWidth="140"
ItemsSource="{x:Static ViewModel.Instruments}" SelectedItemBinding="{Binding Path=SelectedInstrument}">
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="IsEditable" Value="True"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
ドロップダウン リストが正しく表示されます。このフィールドは任意のテキストで編集できますが、フリー テキストのドロップダウンが閉じられると、SelectedInstrument に null が設定されます。選択したアイテムのみに機能します。SelectedValueBinding に変更しようとしましたが、役に立ちません。
この要件を適切に実装するにはどうすればよいですか? 誰かがここに実際のサンプルを投稿できますか?
追加: Orders is ObservableCollection Order has Property has String Title, DateTime Ordered, string SelectedInstrument, Instruments is a string[]
解決策: 次は、bathineni作品からの回避策として提案します。
<DataGrid Margin="0,6" ItemsSource="{Binding Path=Orders}" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeRows="True">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Instrument" MinWidth="140">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=SelectedInstrument, Mode=OneWay}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox IsEditable="True" Text="{Binding Path=SelectedInstrument}"
ItemsSource="{x:Static ViewModel.Instruments}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>