Как связать элемент XDocument со списком в MVVM?

У меня есть XDocument, прочитанный из 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;
    }

Теперь я хочу связать 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" />

Модель представления:

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

person BarryLib    schedule 26.07.2017    source источник
comment
попробуйте добавить DisplayMemberPath=MCUName в поле со списком   -  person tabby    schedule 26.07.2017


Ответы (1)


Когда вы создаете Products в GetProducts(), вы предоставляете MCUName в качестве первого параметра в конструкторе. Для следующего примера я предполагаю, что у каждого продукта есть свойство McuName:

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

Стоит отметить, что это не чистая реализация MVVM. Вам следует рассмотреть возможность изменения дизайна вашего приложения, чтобы оно соответствовало шаблону MVVM.

person Romano Zumbé    schedule 26.07.2017
comment
Это оно! Спасибо! - person BarryLib; 26.07.2017
comment
нет, этот DisplayMemberPath=MCUName лучше, потому что вы сохраняете объект, а не только строку MCUName - person GCamel; 26.07.2017
comment
@GCamel, это полностью зависит от варианта использования. Я согласен, что есть много мест, где я бы использовал DisplayMemberPath, но это не то, о чем просил ОП. - person Romano Zumbé; 26.07.2017
comment
ок, ок, без критики. Но я уверен, что ему придется работать со своей продукцией, и строки будет недостаточно для идентификации. - person GCamel; 26.07.2017
comment
@GCamel Это будет еще одна проблема, и тогда есть место для еще одного вопроса о нем ;-) - person Romano Zumbé; 26.07.2017
comment
Спасибо за ответы ваших ребят. Пожалуйста, смотрите мое обновление. Как мне исправить код в MVVM? - person BarryLib; 27.07.2017