UWP 中的 itemscontrol 不绑定到 observablecollection 项的坐标

Kir*_*neh 4 c# win-universal-app 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>
Run Code Online (Sandbox Code Playgroud)

它确实绑定到颜色和填充颜色。这是 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

Dec*_*oon 5

Setter.Value属性的文档有以下说明:

Windows Presentation Foundation (WPF) 和 Microsoft Silverlight 支持使用绑定表达式为样式中的 Setter 提供值的能力。Windows 运行时不支持 Setter.Value 的 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>
Run Code Online (Sandbox Code Playgroud)