用于填充列表或数组的依赖项属性

时间:2011-07-27 17:33:10

标签: wpf xaml dependency-properties

我有自定义控件。这能够与其他几个控件做一些事情。我希望它有一个元素NotifyControl,我可以绑定一些其他控件,如NotifyControl="{Binding ElementName=controlA}"。这很好,但我想写下n控件。因此,可能是元素值中的列表或多次注意元素。像

<MyControl NotifyControl="{Binding ElementName=a}" NotifiyControl="{Binding ElementName=b}" />

<MyControl NotifyControl="{Binding ElementName=a}, {Binding ElementName=b}" />

哪一种可能,怎么做?我对阵列类型没有运气,也许我上面的符号是错误的。


修改

我现在有

<MyControl>
    <MyControl.NotifyControls>
        <NotifyControlWrapper View="{Binding ElementName=details}" Test="entry one" />
        <NotifyControlWrapper View="{Binding ElementName=gauge}" Test="e2" />
    </MyControl.NotifyControls>
</MyControl>
<OtherControl x:Name="details" />

NotifyControls是一个DependencyProperty并且填充了两个条目,因此这部分工作正常。 NotifyControlWrapper的来源只是一个派生自DependencyObject的类,其中包含两个依赖项属性View(类型INotifyControl)和Test(类型String )。

正如我所说,我的列表中有两个NotifyControlWrapper条目。但是,虽然Test包含给定的字符串,但Viewnull。为什么这样或如何调试?

2 个答案:

答案 0 :(得分:2)

你的问题中没有一个是可能的。您不能两次添加相同的属性,因此#1不起作用。你不能添加两个绑定,所以#2不起作用。我会将属性NotifyControls添加为List类型。 NotifyControl仍然可以作为单独的项目使用,或者添加到NotifyControls中的控件列表中。您可以在Xaml中添加项目:

<MyControl.NotifyControls>
    <ControlWrapper Control="{Binding ElementName=a}"/>
    <ControlWrapper Control="{Binding ElementName=b}"/>
</MyControl.NotifyControls>

ControlWrapper只有一个成员属性Control,因此您可以指定绑定。

答案 1 :(得分:0)

如果N是固定的,您可以使用MultiBinding(带转换器):

<MyControl>
    <MyControl.NotifyControl>
        <MultiBinding Converter="...">
            <Binding ElementName="controlA" />
            <Binding ElementName="controlB" />
            <Binding ElementName="controlC" />
            <Binding ElementName="controlD" />
            <Binding ElementName="controlE" />
            ...
        </MultiBinding>
    </MyControl.NotifyControl>
</MyControl>

如果N改变,则选项是添加ObservableCollection&lt;&gt;在你的类中添加/删除控件,然后绑定到它(再次使用转换器)

<MyControl NotifyControl="{Binding ElementName=ParentElement, Path=MyObservableCollection, Converter=...}" />