【发布时间】:2011-10-25 05:06:48
【问题描述】:
我对这个有点困惑。我有一个名为“AllProducts”的集合,其中有一个名为“ProductGroups”的集合(用于分别对项目进行分组),其中包含一个名为“LineItems”(实际项目)的“产品”对象的集合。
为了进行设置,我在列表框的项的 itemtemplate 中设置了一个带有 DataGrid 的 ListBox。将列表框的 ItemsSource 设置为“ProductGroups”,并且 DataGrid(在 itemtemplate 中)有一个指向 LineItems 的 ItemsSource。
DataGrid 包含列:
"Select" -- 一个复选框和一个单选按钮
"图像" -- 字符串
"名称" -- 字符串
“描述”——字符串
"价格" -- 字符串
“ProductGroup”集合每个组都有一个名为“IsListItem”的布尔属性,它应该告诉我您是否可以为该组选择多个或单个项目(因此 DataGrid 第一列中的复选框和单选按钮)。我希望将检查按钮和单选按钮的可见性属性绑定到“IsListItem”布尔值,我已经使用带有“IsInverted”属性的 BoolToVisibility 转换器设置了该布尔值来来回切换它们。
我遇到的问题是我希望包含复选框/单选按钮的 DataGrid 的第一列绑定到 ProductGroups 的 IsLineItem(这是 ListBox 的 ItemsSource。但是由于 DataGrid 的 ItemsSource 绑定到LineItems,DataGrid 的 DataContext 设置为 LineItems,我无法访问它之外的任何内容。
这里有一些代码可以提供帮助:
列表框 XAML:
<sdk:TabItem Header="Pmt" x:Name="Payment">
<Canvas x:Name="PaymentRoot" DataContext="{Binding Products.ProductGroups}">
<Rectangle Height="418" Canvas.Top="-14" Width="560" Style="{StaticResource MappingRectangleBG}" />
<StackPanel Canvas.Left="20" Canvas.Top="20" Width="520" Height="360">
<ListBox x:Name="lstProductGroups" ItemsSource="{Binding}" ItemTemplate="{StaticResource ProductListItem}" />
</StackPanel>
</Canvas>
</sdk:TabItem>
ListBox ItemTemplate XAML:
<sdk:DataGrid x:Name="dgLineItems" ItemsSource="{Binding LineItems}">
<sdk:DataGrid.Columns>
<sdk:DataGridTemplateColumn Header="Select">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox Visibility="{Binding IsListType, Converter={StaticResource boolToVisibilityConverter}}" />
<RadioButton Visibility="{Binding IsListType, Converter={StaticResource inverseBoolToVisibilityConverter}}" GroupName="{Binding GroupName}"/>
</StackPanel>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn Header="Image">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding ImageUrl}" Height="50" />
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
<sdk:DataGridTextColumn Header="Item Name"
Binding="{Binding Name}" />
<sdk:DataGridTextColumn Header="Item Price"
Binding="{Binding Price}" />
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</StackPanel>
</DataTemplate>
还有我的对象:
public class AllProducts
{
public IEnumerable<ProductOptionGroup> ProductGroups;
}
public class ProductOptionGroup
{
public string GroupName;
public IEnumerable<Product> LineItems;
public bool IsListType;
}
public class Product
{
public int ID;
public int OrdinalNumber;
public string Name;
public string Description;
public Decimal Price;
public string ImageUrl;
public CartItemType Type;
}
(MichaelS):我尝试将其设置为父“PaymentRoot”画布的 DataContext,但它对我没有任何作用。这是我尝试过的:
<CheckBox Visibility="{Binding ElementName=PaymentRoot, Path=DataContext.IsListType, Converter={StaticResource boolToVisibilityConverter}}" />
<RadioButton Visibility="{Binding ElementName=PaymentRoot, Path=DataContext.IsListType, Converter={StaticResource inverseBoolToVisibilityConverter}}" GroupName="{Binding ElementName=PaymentRoot, Path=DataContext.GroupName}"/>
(MichaelS):这是在我的 VM 中的设置方式: 私有 AllProducts 产品;
public AllProducts Products
{
get
{
return products;
}
set
{
//Products.ProductGroups[0].LineItems[0].
products = value;
RaisePropertyChanged("Products");
}
}
【问题讨论】:
-
我觉得下面的问题可以帮到你:(stackoverflow.com/questions/385784/…)
-
我尝试将其设置为父“PaymentRoot”画布的 DataContext,但它没有做任何不同的事情。
标签: silverlight collections datagrid listbox itemssource