UWP中的itemscontrol不绑定到可观察集合项的坐标

本文关键字:集合 观察 坐标 中的 itemscontrol 绑定 UWP | 更新日期: 2023-09-27 18:13:12

我的代码没有绑定到可观察对象Collection中项的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>

它绑定到Color和FillColor。下面是Shape类,它被存储在ObservableCollection LED:

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;
    }
}

UWP中的itemscontrol不绑定到可观察集合项的坐标

Setter的文档。Value属性有如下说明:

Windows Presentation Foundation (WPF)和Microsoft Silverlight支持使用绑定表达式为样式中的Setter提供值。 Windows运行时不支持Setter的Binding用法。值(Binding不会求值,Setter也没有作用,您不会得到错误,但也不会得到期望的结果)。当您从WPF或Silverlight XAML转换XAML样式时,将任何绑定表达式的用法替换为设置值的字符串或对象,或将值重构为共享的{StaticResource}标记扩展值,而不是绑定获得的值。

作为一个解决方案,你可以尝试使用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>