2016-05-13 4 views
1

Я знаю, есть много примеров, но я не получаю его на работу.combobox не привязано к моей ценности

У меня есть Silverlight Mask, где я динамически добавляю UIElements, например Textboxes или ComboBoxes. Пока это работает нормально. Теперь я пытаюсь установить выбранный элемент ComboBox из значений моей базы данных.

Я храню информацию для генерации в своих классах.

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; } 
} 

Мои выбранное значение сохраняет MetadataDataId в виде строки в моем MetadataStore в поле Описание. Я генерации UiElements на основе класса MetaData в коде-за этого, как

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; 
} 

Я думал, что я мог заставить его работать с Dictionary<string, object>

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

но это не сработало, я закончил с генерированием DataTable и выбором первого элемента, который получает мне Object с моими желаемыми динамическими свойствами.

TempObject.Testprop 
TempObject.Nutzen 

The DataSourceCreator используется от http://blog.bodurov.com/How-to-Bind-Silverlight-DataGrid-From-IEnumerable-of-IDictionary/.

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(); 
     } 
    } 

Я установил DataContext для полного StackPanel. В моем TextBox показан правильный текст, сохраненный в TempObject.Testprop. Мой ComboBox` показывает только свой источник Items, но не показывает мой уже выбранный элемент, Id которого хранится в TempObject.Nutzen.

Любые идеи, что мне не хватает?

UPDATE: Я мог бы заставить его работать, привязывая SelectedValue к объекту MetadataData вместо его значения ID и устанавливая SelectedValuePath в имя свойства ID метаданных.

+0

Вам необходимо предоставить привязку к выпадающим спискам. Какой тип источника? Поскольку на основе пути displaymember и выбранногоvaluepath он выглядит как сложный объект, пока вы просто устанавливаете выделенный элемент в строку – Nkosi

+0

Спасибо @Nkosi, я обновил свой вопрос. – float

+0

Покажите, что вы сделали для TextBox. Со всеми изменениями, внесенными вами в вопрос, я больше смущен теперь о вашей проблеме. Может быть, я получу лучшее понимание, если вы покажете мне, что сработало для текстового поля. Я говорю это также потому, что вы указываете, что делаете привязку, когда до сих пор все, что вы показывали, вообще не связано с привязкой. – Nkosi

ответ

0

Я мог бы заставить его работать, привязывая SelectedValue к объекту MetadataData вместо его значения ID и устанавливая SelectedValuePath в имя свойства ID метаданных.