C# 如何将XDocument元素绑定到MVVM中的combobox?

C# 如何将XDocument元素绑定到MVVM中的combobox?,c#,wpf,data-binding,combobox,xelement,C#,Wpf,Data Binding,Combobox,Xelement,我从xml文件中读取了一个XDocument: public ObservableCollection<Product> GetProducts() { ObservableCollection<Product> _products = new ObservableCollection<Product>(); XDocument doc = XDocument.Load(@".\Config\MCU.xml");

我从xml文件中读取了一个XDocument:

    public ObservableCollection<Product> GetProducts()
    {
        ObservableCollection<Product> _products = new ObservableCollection<Product>();
        XDocument doc = XDocument.Load(@".\Config\MCU.xml");
        foreach (XElement productRow in doc.Root.Elements("MCU"))
        {
            var m = new Product(productRow.Element("MCUName").Value, Convert.ToUInt32(productRow.Element("MCUNumber").Value), Convert.ToUInt32(productRow.Element("FlashAddress").Value),
                Convert.ToUInt32(productRow.Element("PageCount").Value), Convert.ToUInt32(productRow.Element("PageSize").Value), productRow.Element("BinFile").Value,
                Convert.ToUInt32(productRow.Element("RAMCodeAdd").Value), Convert.ToUInt32(productRow.Element("MainCR").Value), Convert.ToUInt32(productRow.Element("CRTrimmingAdd").Value),
                Convert.ToUInt32(productRow.Element("CRTrimmingLength").Value), Convert.ToUInt32(productRow.Element("UIDAdd").Value), Convert.ToByte(productRow.Element("UIDLength").Value),
                productRow.Element("UID").Value, productRow.Element("UserArea").Value);

            _products.Add(m);
        }
        return _products;
    }
隐藏在代码中的项目:

    public MainWindow()
    {
        InitializeComponent();
        cb_MCUType.ItemsSource = App.ProductDb.GetProducts();
    }
但这不起作用,组合框填充了
产品
,我应该如何解决这个问题?谢谢

更新: 谢谢你的回复。正如您所建议的,现在我想在MVVM中编写此代码,因此我更改了原始代码:

XAML:

<ComboBox x:Name="cb_MCUType" ItemsSource="{Binding ProductsList}" SelectedValue="{Binding SelectedProduct}" DisplayMemberPath="MCUName" />
public class MainViewModel : INotifyPropertyChanged
{
    private ProductDB pd = new ProductDB();

    public MainViewModel()
    {
       DefaultValue_Load();
    }

    public ObservableCollection<Product> ProductsList { get; set; }

    private Product _selectedProduct; 
    public Product SelectedProduct 
    { 
       get { return _selectedProduct; } 
       set
       {
          _selectedProduct = value;
          NotifyPropertyChanged("SelectedProduct"); 
       }
    }

    public void DefaultValue_Load()
    {

        ProductsList = new ObservableCollectioin<Product>(pd.GetProducts());
    }
}

视图模型:

<ComboBox x:Name="cb_MCUType" ItemsSource="{Binding ProductsList}" SelectedValue="{Binding SelectedProduct}" DisplayMemberPath="MCUName" />
public class MainViewModel : INotifyPropertyChanged
{
    private ProductDB pd = new ProductDB();

    public MainViewModel()
    {
       DefaultValue_Load();
    }

    public ObservableCollection<Product> ProductsList { get; set; }

    private Product _selectedProduct; 
    public Product SelectedProduct 
    { 
       get { return _selectedProduct; } 
       set
       {
          _selectedProduct = value;
          NotifyPropertyChanged("SelectedProduct"); 
       }
    }

    public void DefaultValue_Load()
    {

        ProductsList = new ObservableCollectioin<Product>(pd.GetProducts());
    }
}
public类主视图模型:INotifyPropertyChanged
{
private ProductDB pd=new ProductDB();
公共主视图模型()
{
DefaultValue_Load();
}
公共ObservableCollection产品列表{get;set;}
私人产品(u selected Product);;
公共产品精选产品
{ 
获取{return\u selectedProduct;}
设置
{
_所选产品=价值;
NotifyPropertyChanged(“SelectedProduct”);
}
}
public void DefaultValue_Load()
{
ProductsList=新的可观察集合(pd.GetProducts());
}
}

GetProducts()
中创建
产品时,将
MCUName
作为构造函数中的第一个参数。对于以下示例,我假设每个产品上都有一个属性
McuName

public MainWindow()
{
    InitializeComponent();
    cb_MCUType.ItemsSource = App.ProductDb.GetProducts().Select(p => p.McuName);
}

值得一提的是,这不是一个干净的MVVM实现。你应该考虑重新设计你的应用程序来遵循MVVM模式。

尝试在你的组合框中添加DePaseMealPosith=“McUnMe”,这就是它!谢谢不,这个DisplayMemberPath=“MCUName”更好,因为您保留的是对象,而不仅仅是字符串MCUName@GCamel这完全取决于用例。我同意,我会在很多地方使用
DisplayMemberPath
,但这不是OP要求的。好吧,好吧,没有批评。但我相信他将不得不与他的产品一起工作,而这条线将不足以满足他的需求identify@GCamel这将是另一个问题,然后还有空间问他另一个问题;-)