2016-12-02 4 views
0

Я пытаюсь установить ItemsSource в виде UWP ComboBox к свойству ViewModel, но я получаю сообщение об ошибке:Набор ItemsSource из UWP ComboBox в ViewModel собственности

Error: BindingExpression path error: 'componentsLookup' property not found on 'Orders.Component' 

Соответствующий бит XAML выглядит следующим образом :

<Page.DataContext> 
    <local:OrderPageViewModel x:Name="OrderPageViewModel" /> 
</Page.DataContext> 

<ListView 
    Name="ComponentsList" 
    ItemsSource="{Binding Components}"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <ComboBox 
        ItemsSource="{Binding componentsLookup,Mode=TwoWay}" 
        DisplayMemberPath="ComponentCode"/> 
      </StackPanel> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

Соответствующий бит ViewModel выглядит следующим образом:

public class OrderPageViewModel 
{ 
    public ObservableCollection<Product> Products { get; set; } = new ObservableCollection<Product>(); 
    public List<Component> componentsLookup = new List<Component>(); 

Edit 1: Модели выглядят как этот

public class Product 
{ 
    public string ProductCode { get; set; } 
    public string ProductDescription { get; set; } 
    public List<Component> Components { get; set; } 
    public override string ToString() 
    { 
     return this.ProductCode; 
    } 
} 
public class Component 
{ 
    public Guid ComponentId { get; set; } 
    public Product Product { get; set; } 
    public string ComponentCode { get; set; } 
    public string ComponentDescription { get; set; } 
    public string ComponentColor { get; set; } 
    public decimal ComponentHeight { get; set; } 
    public decimal ComponentWidth { get; set; } 
    public override string ToString() 
    { 
     return this.ComponentCode; 
    } 
} 

Как мне установить ItemsSource на componentsLookup

ответ

1

Вложенные связывания, что вы на самом деле хотите сделать. Поскольку ComboBox вложен внутри ListView, ItemsSourceComboBox должен быть подкатегорией ListView. componentsLookup должно быть свойством класса Orders.Component в вашем фрагменте кода. Вы можете использовать вложенную структуру источника, как следует за связывание:

public class OrderPageViewModel 
{ 
    public ObservableCollection<Product> Products { get; set; } = new ObservableCollection<Product>() 
    { 
     new Product 
     { 
      productname="productname", 
      componentsLookup=new List<Component> 
      { 
       new Component {componentname="test1" }, 
       new Component {componentname="test2" } 
      } 
     }, 
      new Product 
     { 
      componentsLookup=new List<Component> 
      { 
       new Component {componentname="test1" }, 
       new Component {componentname="test2" } 
      } 
     } 
    }; 
} 

public class Component 
{ 
    public string componentname { get; set; } 
} 
public class Product 
{ 
    public string productname { get; set; } 
    public List<Component> componentsLookup { get; set; } 
} 

XAML код

<Page.DataContext> 
    <local:OrderPageViewModel x:Name="OrderPageViewModel" /> 
</Page.DataContext> 
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" > 
    <ListView Name="ComponentsList" ItemsSource="{Binding Products}" > 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <TextBlock Text="{Binding productname}"></TextBlock> 
        <ComboBox DisplayMemberPath="ComponentCode" ItemsSource="{Binding componentsLookup, Mode=TwoWay}" /> 
       </StackPanel> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
</Grid> 

Подробнее пожалуйста, ссылку на official data binding document.

+0

Благодарим вас за предложение @Sunteen - MSFT, но это решение не совсем относится к бизнес-кейсу. Каждый продукт состоит из списка компонентов. Этот список компонентов является подмножеством полного списка всех компонентов. Полный список всех компонентов 'componentsLookup' не является свойством' Product'. В качестве другого примера, в другом элементе управления мы хотим назначить цвет компоненту. Список всех цветов также не может быть свойством 'Product'. Нам нужен способ назначить ItemSource для ComboBox без элемента ItemsSource, являющегося свойством модели. Это обычное деловое дело. – Vague

+0

@ Vague Вы могли бы предоставить свои сущности (класс продуктов и компонентов)? Вам не нужен вложенный источник, но вложенная привязка? Если вы должны вставить «ComboBox» в «ListView»? –

+0

Я добавил модели @Sunteen - MSFT. Мы пытаемся доказать, что UWP подходит для приложения LOB. Код был создан для этого упражнения. Фактические модели принадлежат другой команде, и мы не можем вносить в них изменения. Мы должны иметь возможность предоставлять представления, что им нужно, через ViewModels. – Vague

Смежные вопросы