Я знаю, есть много примеров, но я не получаю его на работу.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 метаданных.
Вам необходимо предоставить привязку к выпадающим спискам. Какой тип источника? Поскольку на основе пути displaymember и выбранногоvaluepath он выглядит как сложный объект, пока вы просто устанавливаете выделенный элемент в строку – Nkosi
Спасибо @Nkosi, я обновил свой вопрос. – float
Покажите, что вы сделали для TextBox. Со всеми изменениями, внесенными вами в вопрос, я больше смущен теперь о вашей проблеме. Может быть, я получу лучшее понимание, если вы покажете мне, что сработало для текстового поля. Я говорю это также потому, что вы указываете, что делаете привязку, когда до сих пор все, что вы показывали, вообще не связано с привязкой. – Nkosi