WPF DataGridComboBoxColumn an "normale" Combobox binden
-
Hallo zusammen,
Es ist zum verrückt werden, mit den Bindings.
Mein DataGrid enthält diese DataGridComboBoxColumn:
<DataGridComboBoxColumn x:Name="FachbereichColumn" Header="Fachbereich" Width="100" ItemsSource="{Binding bekannteFachbereiche, Source={StaticResource getMyPropertysDataSource}}" > <DataGridComboBoxColumn.SelectedValueBinding> <MultiBinding Converter="{StaticResource MultiDebugConverter}" > <Binding XPath="Fachbereich" ConverterParameter="FromMultiBinding1" Converter="{StaticResource DebugConverter}" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay" /> <Binding Path="SelectedValue" ElementName="FachbereichComboBox" BindsDirectlyToSource="True" Converter="{StaticResource DebugConverter}" UpdateSourceTrigger="PropertyChanged" ConverterParameter="FromMultiBinding2" Mode="TwoWay" /> </MultiBinding> </DataGridComboBoxColumn.SelectedValueBinding> </DataGridComboBoxColumn>
Eine zweite ComboBox, außerhalb des DataGrids soll die Auswahl im DataGrid wiederspiegeln und ebenfalls eine Auswahl ermöglichen. Also im Prinzip die gleichen Controls.
Die zweite sieht so aus:
<ComboBox x:Name="FachbereichComboBox" ItemsSource="{Binding bekannteFachbereiche, Source={StaticResource getMyPropertysDataSource}}" SelectedValue="{Binding SelectedItem.ChildNodes[0].InnerText, ConverterParameter=FachbereichCombo, ElementName=dataGridView1, Mode=TwoWay}" />
Wie erreiche ich, das bei einer Auswahl der einen Combo sich die zweite ändert, und umgekehrt natürlich auch.
Es gelingt mir nur in eine Richtung und zwar via:
<DataGridComboBoxColumn x:Name="FachbereichColumn" Header="Fachbereich" Width="100" ItemsSource="{Binding bekannteFachbereiche, Source={StaticResource getMyPropertysDataSource}}" SelectedValueBinding="{Binding XPath=Fachbereich, UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" />
Was übersehe ich ?
-
{Binding SelectedItem.ChildNodes[0].InnerText, ConverterParameter=FachbereichCombo, ElementName=dataGridView1, Mode=TwoWay} (2) (3) (4) (1)
(1) Was ist das?
(2) Was ist das?
(3) Was ist das?
(4) Was ist das?Ohne diese Informationen ist es schwer auf die Frage zu antworten.
Grüssli
-
Ahso ... Sorry.
Das DataGrid ist an einen XMLProvider gebunden. Also:
SelectedItem ist somit ein XmlNode:
Struktur des ganzen:
Question (root)
-Fachbereich
-Schwierigkeit
-Frage
-Antworten
--Antwort A
--Antwort B
--usw.
-
Jetzt bin ich verwirrt
Damit bindest du doch deine Auswahl in der ComboBox ausserhalb des DataGrid an einen fixen Wert in der aktuell ausgwählten Reihe des DataGrid. Dieses Binding nimmt gar keinen Bezug auf die ComboBox im DataGrid.Ich sehe gar nirgends in deinem XAML Code, dass du die beiden ComboBox Steuerelemente probierst zusammenzuhängen ...
Grüssli
-
Da komm ich jetzt nicht mit, aber du weisst es bestimmt besser.
Also:
DataGrid wird durch den XmlProvider gefüttert. Anfangs sollte in der DataGridCombo der übermittelte Wert aus dem Provider ausgewählt sein, was so auch klappt:
<DataGrid IsSynchronizedWithCurrentItem="True" AutoGenerateColumns="False" MouseLeftButtonDown="dataGridView1_MouseDoubleClick" DataContext="{Binding Source={StaticResource XMLprovider}}" ItemsSource="{Binding Mode=TwoWay, XPath=/Fragenliste/Question}" SnapsToDevicePixels="True" SelectionMode="Single" RowDetailsVisibilityMode="Collapsed" RowHeight="25" SelectionChanged="dataGridView1_SelectionChanged" RowEditEnding="dataGridView1_RowEditEnding" > <DataGrid.Columns> <DataGridComboBoxColumn x:Name="FachbereichColumn" Header="Fachbereich" Width="100" ItemsSource="{Binding bekannteFachbereiche, Source={StaticResource getMyPropertysDataSource}}" SelectedValueBinding="{Binding XPath=Fachbereich, UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" />
Bei einer Änderung der Auswahl soll diese natürlich auch an den XMLProvider übertragen werden, was augenscheinlich auch klappt.
Was ich nun erreichen möchte, ist das die ComboBox ausserhalb des DataGrids sich ebenso verhält, und bei einer Änderung der Auswahl auch zu einer Änderung der DataGridCombo führt, folglich auch zur Änderung im Provider.
Das nur nocheinmal um sicher zu gehen, das ich mich richtig ausgedrückt habe.
Damit bindest du doch deine Auswahl in der ComboBox ausserhalb des DataGrid an einen fixen Wert in der aktuell ausgwählten Reihe des DataGrid. Dieses Binding nimmt gar keinen Bezug auf die ComboBox im DataGrid.
Meinst du hier ?
<ComboBox x:Name="FachbereichComboBox" ItemsSource="{Binding bekannteFachbereiche, Source={StaticResource getMyPropertysDataSource}}" SelectedValue="{Binding SelectedItem.ChildNodes[0].InnerText, ConverterParameter=FachbereichCombo, ElementName=dataGridView1, Mode=TwoWay}" />
Wo liegt denn mein Denkfehler ?
-
Ah, ich habe eine Vermutung, wo dein Denkfehler ist. Du denkst, weil der Wert in den XML Daten verändert wird, soll automatisch auch die Auswahl in der ComboBox ausserhalb verändert werden? Das ist aber nicht der Fall, denn von dieser Veränderung bekommt das Binding auf der äusseren ComboBox nichts mit.
Damit sowas funktioniert, muss das Objekt, an welches gebunden wird, das Interface
INotifyPropertyChanged
implementieren. Dies ist aber bei den XML Klassen nicht der Fall. Daher wird das Binding auf der äusseren ComboBox nie darüber informiert, dass ein neuer Wert vorliegt.Jetzt kommt allerdings sicher die Frage, wie man es dann tun soll. Das wäre eine sehr gute Frage.
shaun1981 schrieb:
Da komm ich jetzt nicht mit, aber du weisst es bestimmt besser.
Davon würde ich nicht ausgehen, ich stehe selber immer noch etwas wacklig auf den Beinen bei WPF. Habe zwar letztens endlich mal wieder einen Durchbruch im Verständnis erlebt, aber bin meiner Meinung nach immer noch ein Anfänger
Also zurück zur möglichen Lösung: Führe ein neues
DependencyProperty
ein. Dieses soll sich verändern, wenn eine neue Reihe im DataGrid ausgewählt wird (TwoWay, an die XML Daten gebunden). Zusätzlich ein Binding anSelectedValueBinding
in derDataGridComboBoxColumn
(TwoWay) und anSelectedValue
in der ComboBox ausserhalb des DataGrids (TwoWay).Wenn sich ein
DependencyProperty
verändert, werden automatisch auch die Bindings darüber informiert. Das neu eingeführteDependencyProperty
dient quasi als zentrale Vermittlungsstelle.Sowas in der Art müsste eigentlich funktionieren. Aber habe es nicht getestet, daher gebe ich keine Gewährleistung ab
Grüssli
-
Na das sieht sehr gut aus. Warum komm ich nicht selber auf soetwas ?
public static readonly DependencyProperty DGSelectedXmlNodeProperty = DependencyProperty.Register("DGSelectedXmlNode", typeof(XmlNode), typeof(FragenEditor)); private void dataGridView1_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (dataGridView1.CurrentItem is XmlNode) { DGSelectedXmlNode = dataGridView1.CurrentItem as XmlNode; } } private void FachSchwi_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) { //Bei Änderung der Auswahl von Fachbereich o. Schwierigkeit //diese auch durch DGSelectedXmlNode ändern //Tag 0 = FachbereichComboBox //Tag 1 = SchwierigkeitComboBox if ((String)((ComboBox)sender).SelectedItem != DGSelectedXmlNode.ChildNodes[Convert.ToInt16(((FrameworkElement)sender).Tag)].InnerText) DGSelectedXmlNode.ChildNodes[Convert.ToInt16(((FrameworkElement)sender).Tag)].InnerText = (String)(((ComboBox)sender).SelectedItem); }
Ich habe das Ziel erreicht.
Wieder wat gelernt DRAVERE. THANX