如何将 XDocument 元素绑定到 MVVM 中的组合框?

How to binding XDocument element to combobox in MVVM?

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

现在我想将 XElement MCUName 绑定到组合框:

<ComboBox x:Name="cb_MCUType" SelectedItem="{Binding MCUName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

后面代码中的ItemsSouce:

    public MainWindow()
    {
        InitializeComponent();
        cb_MCUType.ItemsSource = App.ProductDb.GetProducts();
    }

但这不起作用,组合框填充了 Product,我应该如何解决这个问题?谢谢!

更新:

感谢您的回复。按照你的建议,现在我想用MVVM写这个,所以我改变了我原来的代码:

XAML:

<ComboBox x:Name="cb_MCUType" ItemsSource="{Binding ProductsList}" SelectedValue="{Binding SelectedProduct}" DisplayMemberPath="MCUName" />

ViewModel:

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

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

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

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