Как привязать свойство конкретного элемента ObservableCollection к ControlTemplate элемента CustomControl - PullRequest
0 голосов
/ 08 ноября 2011

У меня есть собственный элемент управления с наблюдаемой коллекцией «состояний», вроде кнопки с несколькими состояниями.Чтобы избежать путаницы, нужен только необходимый код:

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» (объекты в коллекции) содержит открытое свойство «Имя», которое я хочу отображать над позициями каждого пользовательского элемента управления.

Сейчас.В 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»).Этот шаблон использует TextBox для отображения имен состояний ... и вот где я потерялся в синтаксисе.Я избавлю вас от моих миллионов неудачных попыток ... вот примерно то, что я имел в виду (примечание: я знаю, что эта привязка НЕ ​​работает!):

<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 отдельных свойства и получить доступ к ним в шаблоне элемента управления.Однако в некоторых случаях может быть до 10 или даже 20 позиций.Я хочу избежать 20 отдельных свойств.

1 Ответ

3 голосов
/ 08 ноября 2011

Попробуйте использовать RelativeSource переплет

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