C# 如何为FrameworkElement VisualCollection创建绑定

C# 如何为FrameworkElement VisualCollection创建绑定,c#,wpf,graphics,drawing,C#,Wpf,Graphics,Drawing,我需要在WPF中绘制一些具有命中测试功能的图表。按照中的说明,我将几何图形绘制为DrawingVisuals,并为它们实现一个主机容器,如下所示(为了简洁起见,跳过命中测试代码): 公共类MyVisualHost:FrameworkElement { 公共视觉集合儿童; 公共MyVisualHost() { 儿童=新的视觉集合(本); } 受保护的重写int VisualChildrenCount { 获取{return children.Count;} } 受保护的重写Visual GetVi

我需要在WPF中绘制一些具有命中测试功能的图表。按照中的说明,我将几何图形绘制为DrawingVisuals,并为它们实现一个主机容器,如下所示(为了简洁起见,跳过命中测试代码):

公共类MyVisualHost:FrameworkElement
{
公共视觉集合儿童;
公共MyVisualHost()
{
儿童=新的视觉集合(本);
}
受保护的重写int VisualChildrenCount
{
获取{return children.Count;}
}
受保护的重写Visual GetVisualChild(int索引)
{
如果(索引<0 | |索引>=子项计数)
抛出新ArgumentOutOfRangeException();
返回子项[索引];
}
}
在xaml中使用它,就像这样

<local:MyVisualHost/>

用户可以缩放和滚动图表,DrawingVisuals会在单独的线程中更新,而不会阻塞UI

如何为
子属性定义绑定,以便在运行时修改它(更新其中包含的DrawingVisuals)

更新 我刚刚注意到,当您在xaml编辑器中选择xaml元素时,属性面板中列出了VisualCollection属性。 我尝试为它定义绑定,但它说:

无法在类型为的“VisualCollection”属性上设置“Binding” “…MyVisualHost…”。只能在服务器上设置“绑定” DependencyObject的DependencyProperty


首先,您需要在容器上设置一些公共属性

public class MyVisualHost : FrameworkElement
{
    public VisualCollection children;

    public MyVisualHost()
    {
        children = new VisualCollection(this);
        children.Add(new Button() {Name = "button"});
        children.Add(new TextBox() {Name = "textbox"});
    }
    protected override int VisualChildrenCount
    {
        get { return children.Count; }
    }
    protected override Visual GetVisualChild(int index)
    {
        if (index < 0 || index >= children.Count)
            throw new ArgumentOutOfRangeException();
        return children[index];
    }

    public int Count => VisualChildrenCount;
    public Visual this[int index]
    {
        get { return GetVisualChild(index); }
    }
}
公共类MyVisualHost:FrameworkElement
{
公共视觉集合儿童;
公共MyVisualHost()
{
儿童=新的视觉集合(本);
添加(新按钮(){Name=“Button”});
添加(newtextbox(){Name=“TextBox”});
}
受保护的重写int VisualChildrenCount
{
获取{return children.Count;}
}
受保护的重写Visual GetVisualChild(int索引)
{
如果(索引<0 | |索引>=子项计数)
抛出新ArgumentOutOfRangeException();
返回子项[索引];
}
公共整数计数=>VisualChildrenCount;
公共视觉此[整数索引]
{
获取{return GetVisualChild(index);}
}
}
接下来在XAML中定义它,如下所示

<Window.Resources>
    <local:MyVisualHost x:Key="MyVisualHost"/>
</Window.Resources>
    <TextBox Text="{Binding Path=Count, Source={StaticResource MyVisualHost}, Mode=OneWay}"/>
    <TextBox Text="{Binding Path=[0].Name, Source={StaticResource MyVisualHost}, Mode=OneWay}"/>

最后绑定到这样的属性

<Window.Resources>
    <local:MyVisualHost x:Key="MyVisualHost"/>
</Window.Resources>
    <TextBox Text="{Binding Path=Count, Source={StaticResource MyVisualHost}, Mode=OneWay}"/>
    <TextBox Text="{Binding Path=[0].Name, Source={StaticResource MyVisualHost}, Mode=OneWay}"/>