如何为 FrameworkElement VisualCollection 创建绑定



>我需要在具有命中测试功能的 WPF 中绘制一些图表。按照文档中的说明,我将几何图形绘制为 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 属性。 我尝试为它定义绑定,但它说:

不能在类型的"可视化集合"属性上设置"绑定" '...我的视觉主机...'。"绑定"只能在 依赖对象的依赖属性

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

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}"/>

相关内容

  • 没有找到相关文章

最新更新