组合框不受我的价值约束

combobox not bound to my value

我知道,有很多例子,但我没有让它发挥作用。

我有一个 Silverlight Mask,我可以在其中动态添加 UIElement,例如文本框或组合框。到目前为止,这工作正常。现在我正在尝试从我的数据库值中设置 ComboBox Selected Item。

我将生成的信息存储在我自己的 classes 中。

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 的字段 Description 中。我正在像这样

中的代码隐藏中基于元数据 class 生成 UIElements
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

http://blog.bodurov.com/How-to-Bind-Silverlight-DataGrid-From-IEnumerable-of-IDictionary/ 使用 DataSourceCreator。

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` 仅显示其项目来源,但未显示我已选择的项目,其 ID 存储在 TempObject.Nutzen.

知道我遗漏了什么吗?

更新: 我可以让它工作,将 SelectedValue 绑定到 MetadataData 对象而不是它的 ID 值,并将 SelectedValuePath 设置为 MetadataData 的 ID 属性 名称。

我可以让它工作,将 SelectedValue 绑定到 MetadataData 对象而不是它的 ID 值,并将 SelectedValuePath 设置为 MetadataData 的 ID 属性 名称。