Xaml 将UWP组合框的ItemsSource设置为ViewModel属性

Xaml 将UWP组合框的ItemsSource设置为ViewModel属性,xaml,uwp,uwp-xaml,Xaml,Uwp,Uwp Xaml,我试图将UWP组合框的ItemsSource设置为ViewModel的属性,但出现错误: Error: BindingExpression path error: 'componentsLookup' property not found on 'Orders.Component' XAML的相关部分如下所示: <Page.DataContext> <local:OrderPageViewModel x:Name="OrderPageViewModel" />

我试图将UWP组合框的ItemsSource设置为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>
public class OrderPageViewModel
{
    public ObservableCollection<Product> Products { get; set; } = new ObservableCollection<Product>();
    public List<Component> componentsLookup = new List<Component>();

ViewModel的相关部分如下所示:

<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>
public class OrderPageViewModel
{
    public ObservableCollection<Product> Products { get; set; } = new ObservableCollection<Product>();
    public List<Component> componentsLookup = new List<Component>();
公共类OrderPageViewModel
{
公共ObservableCollection产品{get;set;}=new ObservableCollection();
公共列表组件lookup=new List();
编辑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;
    }
}
公共类产品
{
公共字符串ProductCode{get;set;}
公共字符串ProductDescription{get;set;}
公共列表组件{get;set;}
公共重写字符串ToString()
{
返回此.ProductCode;
}
}
公共类组件
{
公共Guid组件ID{get;set;}
公共产品产品{get;set;}
公共字符串组件代码{get;set;}
公共字符串组件描述{get;set;}
公共字符串组件颜色{get;set;}
公共十进制组件高度{get;set;}
公共十进制组件宽度{get;set;}
公共重写字符串ToString()
{
返回此.ComponentCode;
}
}

如何将ItemsSource设置为
componentsLookup
嵌套绑定是您真正想要做的。由于
ComboBox
嵌套在
ListView
中,因此
ComboBox
ItemsSource
需要是
ListView
ComponentLookup
的子集合类<代码>顺序。组件在代码段中。您可以使用如下嵌套源结构进行绑定:

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; }
}
公共类OrderPageViewModel
{
公共ObservableCollection产品{get;set;}=new ObservableCollection()
{
新产品
{
productname=“productname”,
ComponentLookup=新列表
{
新组件{componentname=“test1”},
新组件{componentname=“test2”}
}
},
新产品
{
ComponentLookup=新列表
{
新组件{componentname=“test1”},
新组件{componentname=“test2”}
}
}
};
}
公共类组件
{
公共字符串组件名称{get;set;}
}
公共类产品
{
公共字符串productname{get;set;}
公共列表组件lookup{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>


更多详细信息,请参考。

感谢您的建议@Sunteen-MSFT,但此解决方案并不完全符合商业案例。每个产品都由组件列表组成。此组件列表是所有组件完整列表的子集。所有组件的完整列表
组件lookup
不是pr
Product
属性。另一个例子是,在另一个控件中,我们希望为组件指定一种颜色。所有颜色的列表也不能是
Product
的属性。我们需要一种方法,将ItemSource分配给组合框,而ItemsSource不是模型的属性。这是一种常见的业务案例。@可以吗提供您的实体(产品和组件类)?您不想要嵌套源,而是嵌套绑定?您是否必须将
组合框
嵌套在
列表视图
中?我已经添加了@Sunteen-MSFT模型。我们正在尝试证明UWP是否适合LOB应用程序。代码是为本练习生成的。实际模型属于另一个团队,我们可能无法验证对它们进行更改。我们需要能够通过ViewModels提供它们所需的视图。很抱歉@Sunteen-MSFT我无意中发布了错误的模型。我已更正了该错误。