Silverlight 在ItemsControl中绑定几何体属性

Silverlight 在ItemsControl中绑定几何体属性,silverlight,data-binding,Silverlight,Data Binding,在我正在开发的Silverlight游戏中,我使用ItemsControl来显示一个可观察的游戏对象集合,我们称之为Foo。Foo实现INotifyPropertyChanged,并具有一个属性:Radius。ItemsControl的ItemTemplate将每个Foo表示为一个循环路径,路径的半径绑定到Foo.radius 我遇到的问题是,每当我尝试向ObservaleCollection添加内容时,我都会收到一条InvalidOperationException消息,由于对象的当前状态,操

在我正在开发的Silverlight游戏中,我使用ItemsControl来显示一个可观察的游戏对象集合,我们称之为Foo。Foo实现INotifyPropertyChanged,并具有一个属性:Radius。ItemsControl的ItemTemplate将每个Foo表示为一个循环路径,路径的半径绑定到Foo.radius

我遇到的问题是,每当我尝试向ObservaleCollection添加内容时,我都会收到一条InvalidOperationException消息,由于对象的当前状态,操作无效。如果删除RadiusX和RadiusY绑定程序运行良好,并且如果我将Foo.Radius绑定到Path的某个属性,它仍然可以工作。我不知道如何绑定几何体属性。我错过什么了吗

XAML供参考:

<ItemsControl ItemsSource="{Binding}" x:Name="LayoutRoot">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Path Stroke="Black">
                <Path.Data>
                    <EllipseGeometry RadiusX="{Binding Radius}" RadiusY="{Binding Radius}" />
                </Path.Data>
            </Path>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
代码隐藏:

private ObservableCollection<Foo> things = new ObservableCollection<Foo>();

public MainPage()
{
    InitializeComponent();
    LayoutRoot.DataContext = things;
    CompositionTarget.Rendering += Update;
}

void Update(object sender, EventArgs e)
{
    things.Add(new Foo());
}
试试这个

   Dispatcher.BeginInvoke(() => things.Add(new Foo()));

我做了更多的搜索,在Silverlight3中发现了这一点,但几何体继承自DependencyObject。将项目升级到Silverlight 4似乎可以解决问题。

这没有帮助,CompositionTarget.Rendering会在UI线程上触发。这不是将其分派到UI线程。。。它将推迟添加新的Foo,直到使用BeginInvoke完成渲染。。。。也许我们需要一份背景资料。。。。有什么想法吗?@AngelWPF Silverlight dispatcher不像WPF那样支持优先级。@ColinE:我认为值得一试,AngelWPF是对的,它将Add的执行置于当前渲染的帧的奇怪上下文之外。当我尝试这段代码时,它没有在VS中抛出异常,但是IE发现了一个运行时错误,消息是AG_E_PARSER_BAD_PROPERTY_VALUE。这不是真正的代码对吗?你不会希望每次渲染一帧时都添加新内容,你会在几秒钟内用完内存。不,这是一个简化版本。在实际代码中,有一些逻辑来决定是否应该添加新对象。