2017-08-07 6 views
0

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!

Antwort

0

Ist es möglich, die Elementbindung mit einem ausgewählten DataGridComboBoxColumns-Element zu verwenden?

Kurze Antwort: Nein.

Die DataGridCheckBox Spalte hat keine Ahnung, was "dgcbcSelectedIndex" ist. A DataGridComboBoxColumn ist kein visuelles Element, das zum visuellen Baum hinzugefügt wird. Es ist ein Typ, der schließlich ein ComboBox Element erstellt, so dass dies nicht funktioniert.

Sie sollten den ausgewählten Eintrag/Index/Wert der ComboBox an eine Quelleigenschaft Ihres Datenobjekts binden und anschließend die CheckBox an die gleiche Quelleigenschaft binden. Sie können ElementName nicht verwenden.

+0

Sie meinen also, ich muss eine Art "SelectedIndex" -Eigenschaft in meiner "MyObject" -Klasse haben? – tabina

+0

Ja, genau. ... – mm8

Verwandte Themen