Xaml 将UWP组合框的ItemsSource设置为ViewModel属性
我试图将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" />
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
不是prProduct
属性。另一个例子是,在另一个控件中,我们希望为组件指定一种颜色。所有颜色的列表也不能是Product
的属性。我们需要一种方法,将ItemSource分配给组合框,而ItemsSource不是模型的属性。这是一种常见的业务案例。@可以吗提供您的实体(产品和组件类)?您不想要嵌套源,而是嵌套绑定?您是否必须将组合框
嵌套在列表视图
中?我已经添加了@Sunteen-MSFT模型。我们正在尝试证明UWP是否适合LOB应用程序。代码是为本练习生成的。实际模型属于另一个团队,我们可能无法验证对它们进行更改。我们需要能够通过ViewModels提供它们所需的视图。很抱歉@Sunteen-MSFT我无意中发布了错误的模型。我已更正了该错误。