C# 如何将XDocument元素绑定到MVVM中的combobox?
我从xml文件中读取了一个XDocument: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");
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这将是另一个问题,然后还有空间问他另一个问题;-)