【问题标题】:How to Bind a specific ObservableCollection item's property to a CustomControl's ControlTemplate如何将特定 ObservableCollection 项的属性绑定到 CustomControl 的 ControlTemplate
【发布时间】:2011-11-08 16:36:00
【问题描述】:

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

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”类(集合中的对象)包含一个公共“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>

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

我知道信息就在那里,但我发现没有任何东西可以帮助我访问数组(集合)的各个元素中的数据。

提前感谢您的帮助!

赛博

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

【问题讨论】:

    标签: wpf custom-controls observablecollection templatebinding


    【解决方案1】:

    尝试使用RelativeSource 绑定

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

    【讨论】:

    • 太棒了!嗯...第一个没有构建,第二个的语法是:RelativeSource={RelativeSource AncestorType...} 但它有效。谢谢!
    • 另外,与此同时,我发现这篇文章解释了 RelativeSource 语法的所有情况:stackoverflow.com/questions/84278/…
    • @Seb 我更新了我的答案以删除模板绑定,因为它不起作用
    猜你喜欢
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    相关资源
    最近更新 更多