2016-05-13 17 views
1

Ich weiß, es gibt viele Beispiele, aber ich bekomme es nicht zur Arbeit.Combobox nicht an meinen Wert gebunden

Ich habe eine Silverlight-Maske, wo ich dynamisch UIElements wie Textboxen oder ComboBoxes hinzufügen. Bis jetzt funktioniert das gut. Jetzt versuche ich das ausgewählte ComboBox-Objekt aus meinen Datenbankwerten zu setzen.

Ich speichere die Informationen für die Generierung in meinen eigenen Klassen.

public class Metadata 
{ 
    public int? MetadataId { get; set; } 
    public string Name { get; set; } 
    public int Width { get; set; } 
    public int Height { get; set; } 
    public int Column { get; set; } 
    public MetaDataType MetaDataType { get; set; } 
    public List<MetadataData> MetadataData { get; set; } 
} 

public class MetadataData 
{ 
    public int MetadataDataId { get; set; } 
    public int MetadataId { get; set; } 
    public string Description { get; set; } 
} 


public partial class MetadataStore 
{ 
    public Guid MetadataStoreId { get; set; } 
    public Guid ObjectId { get; set; } 
    public Guid ModuleTypeId { get; set; } 
    public int MetadataSetId { get; set; } 
    public int? MetadataSetSetId { get; set; } 
    public int MetadataId { get; set; } 
    public string Description { get; set; } 
    public int? RowId { get; set; } 
    public DataContainer.Profile userProfile { get; set; } 
} 

Meine ausgewählter Wert speichert die MetadataDataId als String in meiner MetadataStore im Feld Beschreibung. Ich bin die UIElements auf der MetaDaten Klasse in Code-Behind-Basis zu erzeugen ähnliche

switch ((MetaDataDataType)metadata.MetaDataType.MetaDataTypeId) 
     { 
      case MetaDataDataType.String: 
       frmElement = new TextBox() { Name = String.Format("dynCtrl_{0}_{1}", metadata.MetadataId, metadata.Name) 
        AcceptsReturn = false, Margin = new Thickness(4), 
        HorizontalAlignment = HorizontalAlignment.Left, 
        Height = metadata.Height, Width = metadata.Width, 
        Style = App.Current.Resources["TextBoxStyleFlat"] as Style }; 
       frmElement.SetBinding(TextBox.TextProperty, 
        new Binding { Mode = BindingMode.TwoWay, Path = new PropertyPath(metadata.Name) }); 
       break; 

      case MetaDataDataType.SingleSelection: 
       frmElement = new ComboBox() 
       { 
        Name = String.Format("dynCtrl_{0}_{1}", metadata.MetadataId, metadata.Name), 
        Margin = new Thickness(4), 
        HorizontalAlignment = HorizontalAlignment.Left, 
        Style = App.Current.Resources["ComboBoxStyleFlat"] as Style, 
        ItemsSource = metadata.MetadataData, 
        DisplayMemberPath = "Description", 
        //SelectedItem = metadata.Name, 
        Height = metadata.Height, 
        Width = metadata.Width 
       }; 

       frmElement.SetBinding(ComboBox.SelectedValueProperty, new Binding { Mode = BindingMode.TwoWay, Path = new PropertyPath(metadata.Name) }); 
       frmElement.SetBinding(ComboBox.SelectedValuePathProperty, new Binding { Mode = BindingMode.TwoWay, Path = new PropertyPath("MetadataDataId") }); 
       default: 
        break; 
} 

Ich dachte, ich könnte es mit einem Dictionary<string, object>

var p = new Dictionary<string, object>(); 
p[mData.Metadata.Name] = Convert.ToInt32(item.Description); 

funktioniert, aber da es nicht funktioniert, ich endete mit der Generierung einer DataTable und Auswahl des ersten Elements, das mir eine Object mit meinen gewünschten dynamischen Eigenschaften bekommt.

TempObject.Testprop 
TempObject.Nutzen 

Der DataSourceCreator wird von http://blog.bodurov.com/How-to-Bind-Silverlight-DataGrid-From-IEnumerable-of-IDictionary/ verwendet.

internal static void generateDataContext(List<MetadataSetMetadata> metadataSetMetadata, List<MetadataStore> metadataStore, ref Grid viewGrid) 
    { 
     if (metadataStore != null && metadataStore.Count > 0) 
     { 

      dynamic expObj = new ExpandoObject(); 
      var p = new Dictionary<string, object>(); 
      foreach (var item in metadataStore.Where(x => x.MetadataSetSetId == null)) 
      { 
       var mData = metadataSetMetadata.FirstOrDefault(x => x.Metadata != null && x.Metadata.MetadataId.Equals(item.MetadataId)); 

       switch ((MetaDataDataType)mData.Metadata.MetaDataType.MetaDataTypeId) 
       { 
        case MetaDataDataType.String: 
        case MetaDataDataType.LongString: 
         p[mData.Metadata.Name] = item.Description; 
         break; 
        case MetaDataDataType.SingleSelection: 
         if (!String.IsNullOrWhiteSpace(item.Description)) 
         { 
          p[mData.Metadata.Name] = Convert.ToInt32(item.Description); 
         } 
         break;      
        default: 
         break; 
       } 
      } 
      var emtyRowList = new List<IDictionary>(); 
      emtyRowList.Add(p); 

      viewGrid.DataContext = DataSourceCreator.ToDataSource(emtyRowList).Cast<object>().FirstOrDefault(); 
      viewGrid.UpdateLayout(); 
     } 
    } 

stelle ich die DataContext für die komplette StackPanel. Mein TextBox zeigt den richtigen Text, der in TempObject.Testprop gespeichert wird. Meine ComboBox zeigt nur die Items-Quelle an, aber sie zeigt nicht mein bereits ausgewähltes Item, dessen Id in TempObject.Nutzen gespeichert ist.

Irgendwelche Ideen, was ich vermisse?

UPDATE: Ich könnte es funktionieren lassen, den SelectedValue an das MetadataData-Objekt anstelle seines ID-Werts binden und den SelectedValuePath auf den ID-Eigenschaftsnamen von MetadataData festlegen.

+0

Sie müssen eine Bindung an die Combobox liefern. Welcher Art ist die Artikelquelle? Denn basierend auf dem Pfad des Anzeigeelements und dem ausgewählten Wertpfad sieht es wie ein komplexes Objekt aus, während Sie das ausgewählte Element nur auf eine Zeichenfolge setzen – Nkosi

+0

Danke @Nkosi, ich habe meine Frage aktualisiert. – float

+0

Zeigen Sie, was Sie für die TextBox getan haben. Mit all den Änderungen, die Sie an der Frage gemacht haben, bin ich jetzt mehr verwirrt über Ihr Problem. Vielleicht kann ich ein besseres Verständnis bekommen, wenn Sie mir zeigen, was für die Textbox funktionierte. Ich sage das auch deshalb, weil Sie angeben, dass Sie verbindlich sind, wenn bisher alles, was Sie gezeigt haben, überhaupt nicht verbindlich ist. – Nkosi

Antwort

0

Ich könnte es arbeiten lassen, den SelectedValue an das MetadataData Object statt dessen ID-Wert binden und den SelectedValuePath auf den ID-Eigenschaftsnamen von MetadataData setzen.