Ist es möglich, die Elementbindung mit einem ausgewählten DataGridComboBoxColumns-Element zu verwenden?Elementbindung an DataGridComboBoxColumn
Ich habe ein Objekt MyObject, das eine Eigenschaft "ListOfSomeTypes" des Typs ObservableCollection enthält. SomeType implementiert INotifyPropertyChanged.
Eine Liste von SomeType sollte in einem DataGrid angezeigt werden. Für die "ListOfSomeTypes" suche ich nach einer Lösung, um Folgendes zu tun: Das DataGrid hat zwei Spalten. Eine ist eine DataGridComboBoxColumn mit einer festen Liste von ganzen Zahlen, z. {0,1,2,3}. Die ItemsSource dieser Spalte wird über Binding (Eigenschaft "ListOfIndices", die nicht Teil von MyObject ist) festgelegt. Die zweite Spalte sollte den Inhalt von "ListOfSomeTypes" an der ausgewählten Indexposition anzeigen (aus der anderen Spalte). Also dachte ich, ich könnte einfach einen MultiConverter verwenden, um die Werte beider zu überprüfen und den richtigen Wert für die Anzeige auszuwählen. Das Problem ist, dass der Wert, der der Index sein soll, nie gesetzt ist (null), obwohl die Combobox das erste Element meiner Indexliste zeigt.
Da die Indizes nur zur Anzeige benötigt werden, möchte ich keine "SelectedIndex" -Eigenschaft in meiner MyObject-Klasse haben. Ist es möglich, mit Elementbindung auf den ausgewählten Wert der Combobox zuzugreifen? Welche Eigenschaft muss verwendet werden (da SelectedValueBinding falsch ist)? Oder gibt es einen besseren Weg?
Dies ist mein Code:
<DataGridCheckBoxColumn Header="SomeType">
<DataGridCheckBoxColumn.Binding>
<MultiBinding Converter="converters:SomeTypeCodeToBoolMultiConverter}">
<Binding Path="ListOfSomeTypes" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>
<Binding ElementName="dgcbcSelectedIndex" Path="SelectedValueBinding"
UpdateSourceTrigger="PropertyChanged"/>
</MultiBinding>
</DataGridCheckBoxColumn.Binding>
</DataGridCheckBoxColumn>
<DataGridComboBoxColumn x:Name="dgcbcSelectedIndex" Header="Indices">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=Data.ListOfIndices, Source={StaticResource proxy}, UpdateSourceTrigger=PropertyChanged}" />
<Setter Property="IsSynchronizedWithCurrentItem" Value="True"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=Data.ListOfIndices, Source={StaticResource proxy}, UpdateSourceTrigger=PropertyChanged}" />
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
Der Konverter
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values == null || values.Length != 2)
return null;
var listOfSomeTypes= (ObservableCollection<SomeType>) values[0];
if (listOfSomeTypes!= null)
{
int selectedIndex = 0;
if (values[1] != null)
{
try { selectedIndex = (int)values[1]; }
catch (Exception) { }
}
if (listOfSomeTypes.Count > selectedIndex)
{
var someType= listOfSomeTypes[selectedIndex ];
return someType == TypeA;
}
}
return null;
}
Vielen Dank für Ihre Hilfe!
Sie meinen also, ich muss eine Art "SelectedIndex" -Eigenschaft in meiner "MyObject" -Klasse haben? – tabina
Ja, genau. ... – mm8