Как использовать Холст в качестве ItemsPanel для ItemsControl в Silverlight 3

Я пытаюсь установить свойства Canvas в ItemsControl DataTemplate с Silverlight 3. Согласно этому сообщению, единственный способ сделать, который должен установить его с помощью ItemsContainerStyle для типа ContentPresenter, так как свойства Canvas только вступают в силу на прямых детях Холста. Это, кажется, не работает в SL3, так как ItemsControl не имеет свойства ItemsContainerStyle, таким образом, я попробовал ListBox, как рекомендуется этой статьей, но он все еще не работает. От XAML ниже, я ожидал бы видеть зеленый квадрат с номерами 10, 30, 50, 70, располагающимися каскадом от "NW" до направления "SE". Кто-либо может сказать мне, почему они все сложены друг на друге в углу NW?


    
        
            
                
                    
                
            
            
                
                    
                                
            
            
                
            
            
                10
                30
                50
                70
            
        
    

11
задан Community 23 May 2017 в 12:25
поделиться

2 ответа

Я тоже не могу объяснить, что вы видите. Ваш Xaml сломан по крайней мере двумя способами.

Во-первых, сам Xaml не работает, потому что это: -

<Style TargetType="ContentPresenter">

должно быть

<Style TargetType="ContentControl">

Контейнеры элементов в случае ListBox имеют тип ListBoxItem , производные от ContentControl .

Тем не менее, без этого размещение {Binding} в установщиках стилей по-прежнему не работает. Думаю, вы представляли, что стиль будет применяться к каждому элементу по очереди и получить его значение из текущего элемента. Однако даже если бы привязка работала в этом стиле, был бы только один стиль, и он получал бы привязку данных из ListBox DataContext . Это другой DataContext , который применяется к каждому элементу ListBox (который в данном случае является каждым элементом в коллекции Items).

Тем не менее, я думаю, что у Бена есть разумное решение, которое исключает этот подход.

0
ответ дан 3 December 2019 в 09:19
поделиться

Я не уверен, сработает ли это в вашем сценарии, но я делал это в прошлом, используя RenderTransform.

<ItemsControl>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas Background="Green" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBox Text="{Binding}">
                <TextBox.RenderTransform>
                    <TranslateTransform X="100" Y="100" />
                </TextBox.RenderTransform>
            </TextBox>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl.Items>
        <System:Int32>10</System:Int32>
        <System:Int32>30</System:Int32>
        <System:Int32>50</System:Int32>
        <System:Int32>70</System:Int32>
    </ItemsControl.Items>
</ItemsControl>

Или в случае привязки вам нужно будет использовать конвертер

<ItemsControl>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas Background="Green" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBox Text="{Binding}" RenderTransform="{Binding Converter={StaticResource NumberToTransformGroupConverter}}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl.Items>
        <System:Int32>10</System:Int32>
        <System:Int32>30</System:Int32>
        <System:Int32>50</System:Int32>
        <System:Int32>70</System:Int32>
    </ItemsControl.Items>
</ItemsControl>

Converter

public void ConvertTo(object value, ...)
{
    int intValue = int.Parse(value.ToString());

    return new TransformGroup()
    {
        Children = new TransformCollection()
        {
            new TranslateTransform { X = intValue, Y = intValue }
        }
    };
}
7
ответ дан 3 December 2019 в 09:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: