如何为FrameworkElement VisualCollection创建绑定

时间:2019-08-18 22:02:48

标签: c# wpf graphics drawing

我需要在WPF中绘制一些具有点击测试功能的图表。按照the docs中的说明,我将几何图形绘制为DrawingVisuals,并为它们实现了这样的宿主容器(为简洁起见,跳过了点击测试代码):

public class MyVisualHost : FrameworkElement
{
    public VisualCollection children;

    public MyVisualHost()
    {
        children = new VisualCollection(this);
    }
    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];
    }
}

像这样在xaml中使用它

<local:MyVisualHost/>

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

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

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

  

不能在类型的“ VisualCollection”属性上设置“ Binding”   '... MyVisualHost ...'。只能在   DependencyObject的DependencyProperty

1 个答案:

答案 0 :(得分:-2)

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

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

接下来像这样在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}"/>