如何将特定的ObservableCollection项的属性绑定到CustomControl的ControlTemplate

时间:2011-11-08 16:36:01

标签: wpf custom-controls observablecollection templatebinding

我有一个自定义控件,带有一个可观察的“状态”集合,有点像多状态按钮。这里只有必要的代码以避免混淆:

public class MyMultiStateBtn : ItemsControl
{
    MyMultiStateBtn()
    {
       m_states = new ObservableCollection<MyState>();
    }

    private ObservableCollection<MyState> m_states;
    public System.Collections.ObjectModel.ObservableCollection<MyState> States
    {
       get { return m_states; }
       set { m_states = value; }
    }
}

“MyState”类(集合中的objets)包含一个公共“Name”属性,我希望在每个自定义控件的位置上方显示该属性。

现在。在窗口的XAML中,我创建了2个MyMultiStateBtn实例,其中一个看起来像这样(第二个有不同的“状态”列表,显然):

<local:MyMultiStateBtn x:Name="AAA" Template="{StaticResource MultiStateBtnTpl}">
    <local:MyMultiStateBtn.States>
        <local:MyState Name="On"/>
        <local:MyState Name="Off" Value="1"/>
        <local:MyState Name="Auto" Value="2"/>
    </local:MyMultiStateBtn.States>
</local:MyMultiStateBtn>

到目前为止一切顺利。请注意,这些控件正在使用模板(“MultiStateBtnTpl”)。这个模板使用TextBoxes来显示状态名称...这就是我在语法中丢失的地方。我会饶恕你百万次失败的尝试......这里大概是我的想法(注意:我知道这种绑定不起作用!):

<ControlTemplate x:Key="MultiStateBtnTpl" TargetType="{x:Type loca:MyMultiStateBtn}">
    <Grid Width="130" Height="120">
        <TextBlock x:Name="tkValue1" Text="{Binding States, Path=[0].Name}" />
        <TextBlock x:Name="tkValue2" Text="{Binding States, Path=[1].Name}" />
        <TextBlock x:Name="tkValue3" Text="{Binding States, Path=[2].Name}" />
    </Grid>
</ControlTemplate>

简而言之:如何让模板找到埋藏在可观察集合中的字符串......

我知道信息已经存在,但我找不到任何帮助我访问数组(集合)的各个元素中的数据。

提前感谢您的帮助!

的Seb

PS:我可以创建3个单独的属性,并访问controltemplate中的那些属性。但是,在某些情况下,最多可能有10个,甚至20个职位。我想避免拥有20个独立的属性。

1 个答案:

答案 0 :(得分:3)

尝试使用RelativeSource绑定

<TextBlock x:Name="RelativeSourceBinding" 
           Text="{Binding States[0].Name, 
               RelativeSource={AncestorType local:MyMultiStateBtn}}" />