Silverlight: DataGrid внутри ListBox. Привязка столбца DataGrid к свойству ItemsSource родительского списка. Silverlight - PullRequest
0 голосов
/ 11 августа 2011

Я немного озадачен этим.У меня есть коллекция под названием «AllProducts», в которой есть коллекция под названием «ProductGroups» (для группирования элементов по отдельности), которая содержит коллекцию объектов «Product» под названием «LineItems» (фактические элементы).

Чтобы установить это, я установил ListBox с DataGrid внутри элемента itemtemplate для элементов ListBox.При установке ItemsSource в списке на «ProductGroups» и DataGrid (в шаблоне элемента) имеется ItemSource, указывающий на LineItems.

DataGrid содержит столбцы:
«Выбрать» - флажок и радиокнопка
«Изображение» - строка
«Имя» - строка
«Описание» - строка
«Цена» - строка

Коллекция «ProductGroup» имеетсвойство bool под названием «IsListItem» для каждой группы, которое должно сообщать мне, можете ли вы выбрать несколько или один элемент для этой группы (отсюда флажок и переключатель в первом столбце DataGrid).Я хочу, чтобы свойство видимости checkbuttons и radiobuttons было связано с bool "IsListItem", который я уже настроил с помощью конвертера BoolToVisibility со свойством IsInverted, чтобы переключать их назад и вперед.

Проблема в том, что я 'Я сталкиваюсь с тем, что я хочу, чтобы первый столбец DataGrid, который содержит флажки / радиокнопки, был связан с IsLineItem для ProductGroups (который является ItemsSource для ListBox. Но поскольку ItemsSource DataGrid связан с LineItems, DataContext из DataGrid являетсяустановлен на LineItems, и я не могу получить доступ к чему-либо за его пределами.

Вот некоторый код, чтобы помочь:

ListBox 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): я пытался установить его в DataContext родительского Canvas "PaymentRoot", но он ничего не делает для меня. Вот чтоЯ попробовал:

<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): вот как это настроено на моей виртуальной машине: частные продукты AllProducts;

public AllProducts Products
    {
        get
        {
            return products;
        }
        set
        {
            //Products.ProductGroups[0].LineItems[0].
            products = value;
            RaisePropertyChanged("Products");
        }
    }

Ответы [ 2 ]

0 голосов
/ 13 августа 2011

Наконец-то всё исправили! В итоге мне пришлось полностью избавиться от DataGrid, поскольку многие элементы управления из этого инструментария, похоже, не могут связать эту ошибку с внешней средой даже при связывании элементов.

Я превратил DataGrid в ListBox с другим DataTemplate для LineItems, полностью настроив его внешний вид, чтобы получить аналогичный вид, который я имел с DataGrid.

Также следует отметить: сначала я попытался связать StackPanel за пределами DataTemplate через связывание элементов, но, похоже, с этим возникла проблема. Поэтому я установил сетку в DataContext объекта DataTemplate, а затем установил флажок и радиокнопку, привязанную к сетке внутри dataTemplate родительского списка посредством привязки элемента, и это помогло!

Вот рабочий код для всех, кто столкнется с этой проблемой позже!:

<DataTemplate x:Key="LineItemsTemplate">
    <StackPanel Orientation="Horizontal">
        <StackPanel Height="100" Width="100">
            <StackPanel Height="40" Orientation="Vertical">
                <RadioButton Content="{Binding Name}" Visibility="{Binding ElementName=GridDataHolder, Path=DataContext.IsListType, Converter={StaticResource boolToVisibilityConverter}}" GroupName="{Binding ElementName=GridDataHolder, Path=DataContext.GroupName}"/>
                <CheckBox Content="{Binding Name}" Visibility="{Binding ElementName=GridDataHolder, Path=DataContext.IsListType, Converter={StaticResource inverseBoolToVisibilityConverter}}"/>
            </StackPanel>
            <Image Source="{Binding ImageUrl}" Height="50" />
        </StackPanel>
        <TextBlock TextWrapping="Wrap" Text="{Binding Description}"/>
    </StackPanel>
</DataTemplate>
<DataTemplate x:Key="ProductListItem">
    <StackPanel x:Name="GridDataHolder">
            <TextBlock TextWrapping="Wrap" Text="{Binding GroupName}" VerticalAlignment="Top" d:LayoutOverrides="Width"/>
            <ListBox x:Name="lstProductGroups"  ItemsSource="{Binding LineItems}" ItemTemplate="{StaticResource LineItemsTemplate}">
            </ListBox>
    </StackPanel>
</DataTemplate>

<sdk:TabItem Header="Pmt" x:Name="Payment">
            <Canvas>
                <Rectangle Height="418" Canvas.Top="-14" Width="560" Style="{StaticResource MappingRectangleBG}" />
                <ScrollViewer Height="389" Width="545" x:Name="PaymentRoot" DataContext="{Binding Products.ProductGroups}">
                    <StackPanel Orientation="Vertical" ScrollViewer.VerticalScrollBarVisibility="Auto" Width="500" HorizontalAlignment="Center">
                        <ListBox x:Name="lstProductGroups"  ItemsSource="{Binding}" ItemTemplate="{StaticResource ProductListItem}" />      
                    </StackPanel>
                </ScrollViewer>
            </Canvas>
        </sdk:TabItem>

Спасибо MichaelS за всю вашу помощь! Вы заставили меня идти по правильному пути!

0 голосов
/ 12 августа 2011

Обновление: Приведенный ниже код не будет работать, поскольку это известная проблема, обнаруженная позднее на таймфрейме Silverlight 3.Установка привязки в событии LoadingRow с использованием column.GetCellContent (e.Row) должна решить эту проблему.

В этом конкретном случае вы захотите сделать это, поскольку сама dataGrid является шаблоном dataTemplate другого элемента управления.


Попробуйте: оберните datagrid другим Grid.Назовите его и используйте для привязки элемента.Этот код должен работать:

<StackPanel>
        <Grid x:Name="GridDataHolder">
            <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 ElementName=GridDataHolder, Path=DataContext.IsListType, Converter={StaticResource boolToVisibilityConverter}}" />
                                    <RadioButton Visibility="{Binding ElementName=GridDataHolder, Path=DataContext.IsListType, Converter={StaticResource inverseBoolToVisibilityConverter}}" GroupName="{Binding ElementName=GridDataHolder, Path=DataContext.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>
        </Grid>
    </StackPanel>

Кстати, я не уверен, работает ли привязка с открытыми членами, вам может потребоваться изменить эти связанные элементы на открытые свойства.

...