Einzel-klicken Sie auf Bearbeiten auf WPF datagrid , combobox-Spalte Vorlage
Habe ich agrid hat die drei Spalten :
- Friendly Name
- Kontinent Name
- Land Name
Der 1. Spalte eine textbox-Spalte Editierbar. Die zweite Spalte ist eine Combobox, zeigt die Liste der Kontinente. Die 3. Spalte ist eine combobox zeigt die Liste der Länder auf dem Kontinent ausgewählt, in der 2. Spalte. Ich möchte zu implementieren, single klicken Sie auf diese Spalte. Ich habe versucht, die Lösung in diesem link
Einzel-klicken Sie auf Bearbeiten in WPF DataGrid
Aber das funktioniert nur auf der ersten Spalte und nicht die anderen beiden (DataGridTemplateColumn) Spalten.
Wie das möglich ist. Bitte vorschlagen. Das Beispiel von XAML und data Beschreibung wird unten gegeben.
<DataGrid Grid.Row="1" VerticalAlignment="Top"
ItemsSource="{Binding Path=GeographyData,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
Style="{StaticResource DataGridStyleNormal}">
<DataGrid.Columns>
<DataGridTextColumn Width="*" Header="Friendly name" Binding="{Binding Path=FriendlyName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
<!--FilterDef -->
<DataGridTemplateColumn Width="*"
Header="Continents">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox SelectedValue="{Binding ContinentId, Mode=TwoWay}"
SelectedValuePath="ID"
DisplayMemberPath="Name"
ItemsSource="{Binding Path=DataContext.ContinentsAndCountries,Mode=OneWay,UpdateSourceTrigger=PropertyChanged,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGrid}}}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource ContinentCaptionConverter}">
<Binding Path="ContinentId"/>
<Binding Path="DataContext.ContinentsAndCountries" RelativeSource="{RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGrid}}"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<!--Level-->
<DataGridTemplateColumn Width="*"
Header="Countries">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox SelectedValue="{Binding CountryId, Mode=TwoWay}"
SelectedValuePath="ID"
DisplayMemberPath="Name">
<ComboBox.ItemsSource>
<MultiBinding Converter="{StaticResource CountryValuesConverter}">
<Binding Path="DataContext.ContinentsAndCountries" RelativeSource="{RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGrid}}"/>
<Binding Path="ContinentId"/>
</MultiBinding>
</ComboBox.ItemsSource>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource CountryCaptionConverter}">
<Binding Path="DataContext.ContinentsAndCountries" RelativeSource="{RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGrid}}"/>
<Binding Path="ContinentId"/>
<Binding Path="CountryId"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
Hinweis : Die Daten "ContinentsAndCountries" ist eine observable-collection von master-detail-Daten.
- Girija
- Vielleicht die Antwort hilft Ihnen.
- Doesnot Hilfe 🙁
- Dann nehmen Sie einen Blick an Navigation mit der Tabulatortaste von Zelle zu Zelle nicht setzen Sie den Fokus auf control.
- Doesnot Arbeit. Ich denke, es tut die gleiche Sache wie in diesem link stackoverflow.com/questions/3426765/...
- Ich Tat dies, indem die combobox Geladen-Ereignis private void Combobox_Loaded(object sender, RoutedEventArgs e) { if (sender != null) { ComboBox cmb = sender as ComboBox; cmb.IsDropDownOpen = true; } }
- Fein. Dann poste es als Antwort und es akzeptieren.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich Tat dies, indem die combobox Geladen Veranstaltung
Sorry für die er necro, ich habe endlich herausgefunden, wie man ein wirklich einfaches klicken UX. Sie haben zum abfangen der DataGridCell die OnGotFocus-Ereignis festlegen der cell-Modus zu IsEditing, dann abfangen, das Loaded-Ereignis für die Schauspieler, die Kontrolle in Ihrem CellEditingTemplate:
Im code-behind, müssen Sie drei Handler; eine für die Zelle, und eine für jede Art von Steuerelement (ComboBox, TextBox):