2017-08-22 3 views
0

In WPF habe ich ein Datagrid, das 2 Spalten hat. Die erste ist eine Zeichenfolge, die zweite ist eine ComboBox. Mein Ziel ist es, die Eigenschaft IsEnable der Combobox jedes Mal falsch zu setzen, wenn sie die Zeichenfolge der Spalte 1 enthält.Wie legt man die Eigenschaft enable einer programmgesteuert generierten ComboBox in einem Datagrid in WPF fest?

Meine Datenquelle stammt aus einer Datenansicht (einige andere Spalten müssen dynamisch generiert werden).

Ich denke, die Lösung muss um den "verbindlichen" Wert herum sein, aber ... ich weiß nicht, was ich hineinlegen soll ... Irgendeine Idee?

DataView DG = FunctionCreatingADataView(); 
Datagrid1.ItemsSource = DG; 
Datagrid1.AutoGenerateColumns = true; 
Datagrid1.Items.Refresh(); 

DataGridTemplateColumn dgTemplateColumn = new DataGridTemplateColumn(); 
dgTemplateColumn.Header = "Attachment"; 
var newCombobox = new FrameworkElementFactory(typeof(ComboBox)); 
newCombobox.SetValue(ComboBox.NameProperty, "myCBB"); 

Binding enableBinding = new Binding(); 
enableBinding.Source = "HasAttachment";// A column in my DG 
enableBinding.Mode = BindingMode.OneWay; 
newCombobox.SetValue(ComboBox.IsEnabledProperty, enableBinding); 

List<string> listUnitAlreadyAttached = new List<string>(); 
// Load list with some code 

enableBinding.Source = listUnitAlreadyAttached; 
newCombobox.SetBinding(ComboBox.ItemsSourceProperty, enableBinding); 

var dataTplT = new DataTemplate(); 
dataTplT.VisualTree = newCombobox; 
dgTemplateColumn.CellTemplate = dataTplT; 
Binding bindingIsEnable = new Binding(); 

Datagrid1.Columns[1] = dgTemplateColumn; 
+0

Sie haben Ihre Bedingung bereits geschrieben: ** Mein Ziel ist es, die Eigenschaft IsEnable der Combobox jedes Mal auf false zu setzen, wenn sie die Zeichenfolge der Spalte 1 enthält. ** Schreiben Sie einen 'IMultiValueConverter' und binden Sie diesen Konverter an die Zeichenfolge in der Spalte und der Combobox-Wert. Noch ein Hinweis: Warum macht man das im Code hinterher? Doing in XAML ist einfacher und besser zu lesen. –

+0

Danke für deine hinzufügen Mighty. Ich habe gewählt, um das programmatisch zu schreiben, weil ich andere Spalten habe, die dynamisch erzeugt werden (könnte von 2 zu Tausenden haben ...), sieht in XAML kompliziert aus. – PetersLast

+0

Ihre Begrüßung. Wenn Sie mit der Implementierung kämpfen, kann ich Ihnen helfen. –

Antwort

1

Sie sollten die Path des Satzes Binding zu HasAttachment:

newCombobox.SetValue(ComboBox.IsEnabledProperty, new Binding("HasAttachment")); 

Sie wollen einen Konverter verwenden, um den Wert von true zu false zu konvertieren:

newCombobox.SetValue(ComboBox.IsEnabledProperty, new Binding("HasAttachment") { Converter = new InverseBooleanConverter() }); 

How to bind inverse boolean properties in WPF?

+0

Sie sollten einen 'IValueConverter' (bool zum gegenüberliegenden bool) hinzufügen, weil er sagte * Wenn HasAttachment auf true gesetzt ist, muss Combobox Disable sein, und wenn HasAttachment auf false gesetzt ist, muss ComboBox aktiviert sein * –

+1

@MightyBadaboom: Antwort bearbeitet. – mm8

+0

Vielen Dank an Mighty und mm8! – PetersLast

Verwandte Themen