itemscontrol в UWP не привязывается к координатам наблюдаемых элементов коллекции

Мой код не связывается со свойством X и Y предметов в наблюдаемой Коллекции. Что случилось:

    <ItemsControl ItemsSource="{Binding LED}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas Background="SkyBlue"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemContainerStyle>
            <Style TargetType="ContentPresenter">
                <Setter Property="Canvas.Left" Value="{Binding X}" />
                <Setter Property="Canvas.Top" Value="{Binding Y}" />
            </Style>
        </ItemsControl.ItemContainerStyle>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Ellipse Stroke="{Binding Color}" Fill="{Binding FillColor}" StrokeThickness="1" Width="40" Height="40"></Ellipse>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

Это связывает с цветом и FillColor. Вот класс Shape, который хранится в индикаторе ObservableCollection:

class Shape
{
    public int X { get; private set; }
    public int Y { get; private set; }
    public string Color { get; private set; }
    public string FillColor { get; private set; }

    public Shape (int x, int y, string color, string fillColor)
    {
        X = x;
        Y = y;
        Color = color;
        FillColor = fillColor;
    }

}

1 ответ

Решение

Документация для свойства Setter.Value содержит следующее примечание:

Windows Presentation Foundation (WPF) и Microsoft Silverlight поддерживали возможность использовать выражение Binding для предоставления значения для Setter в стиле. Среда выполнения Windows не поддерживает использование Binding для Setter.Value (Binding не будет оцениваться, а Setter не будет работать, вы не получите ошибок, но вы также не получите желаемого результата). При преобразовании стилей XAML из WPF или Silverlight XAML замените все используемые выражения Binding строками или объектами, которые устанавливают значения, или реорганизуйте значения как общие значения расширения разметки {StaticResource}, а не полученные из Binding значения.

В качестве обходного пути вы можете попробовать вместо этого использовать RenderTransform:

<Ellipse Stroke="{Binding Color}" Fill="{Binding FillColor}" StrokeThickness="1" Width="40" Height="40">
    <Ellipse.RenderTransform>
        <TranslateTransform X="{Binding X}" Y="{Binding Y}"/>
    </Ellipse.RenderTransform>
</Ellipse>
Другие вопросы по тегам