2008-12-03 5 views
0

У меня есть ListBox, где количество элементов добавлено на основе и целочисленного свойства, заданного пользователем. Элементы создаются из ресурса ControlTemplate, который состоит из метки и TextBox внутри DockPanel. Метка не привязана к данным, но я хотел бы, чтобы она имела несколько динамический контент на основе (index + 1) ListboxItem, для которого он содержится. Мой вопрос/проблема в том, что я хочу обновить содержимое метки для каждого ListboxItem, но по какой-то причине не могу получить доступ к ярлыку. Я не знаю, как это сделать посредством привязки данных к метке, поскольку метка находится в шаблоне и не знает, что у нее есть родитель, который является ListboxItem. Может ли кто-нибудь помочь мне прояснить некоторые из этих недоразумений, чтобы вернуть меня на правильный путь, пожалуйста?WPF: обновить ярлык в элементе списка

<ControlTemplate TargetType="{x:Type ListBoxItem}"> 
    <DockPanel Background="Transparent" Height="28" Name="playerDockPanel" VerticalAlignment="Bottom"> 
     <Label Name="playerNameLabel" DockPanel.Dock="Left" Content="Player"></Label> 
     <TextBox Height="23" Width ="150" Name="playerName" DockPanel.Dock="Right"/> 
    </DockPanel> 
</ControlTemplate> 

Я хотел бы иметь возможность связать содержание Label в XAML, или обновить содержание Label в коде позади. Я не уверен, какой будет лучший маршрут.

ответ

0

UPDATE: Сначала я пытался найти Label в шаблоне, как это ....

Label label = (Label)lbi.Template.FindName("playerNameLabel",lbi); 

Я узнал, что вы должны вызвать ApplyTemplate() для того, чтобы построить визуальное дерево шаблона, прежде чем он будет быть в состоянии найти элемент.

0

Вы должны создать IMultiValueConverter, который получит индекс шаблона:

public class PositionConverter : IMultiValueConverter 
{ 
    public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture) 
    { 
     ItemsControl itemsControl = value[0] as ItemsControl; 
     UIElement templateRoot = value[1] as UIElement; 
     if (templateRoot != null) 
     { 
      UIElement container = ItemsControl.ContainerFromElement(itemsControl, templateRoot) as UIElement; 
      if (container != null) 
      { 
       return itemsControl.ItemContainerGenerator.IndexFromContainer(container); 
      } 
     } 

     return null; 
    } 

    public object[] ConvertBack(object value, Type[] targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Затем вы должны использовать конвертер в ваш DataTemplate:

<DataTemplate x:Key="itemTemplate"> 
    <DockPanel Background="Transparent" Height="28" Name="playerDockPanel" VerticalAlignment="Bottom"> 
     <Label Name="playerNameLabel" DockPanel.Dock="Left" Content="{Binding Title}"></Label> 
     <Label Height="23" Width ="150" Name="playerName" DockPanel.Dock="Right"> 
      <Label.Content> 
       <MultiBinding Converter="{StaticResource positionConverter}"> 
        <!-- The ItemsControl--> 
        <Binding ElementName="listBox" /> 
        <!-- The root UIElement--> 
        <Binding ElementName="playerDockPanel"/> 
       </MultiBinding> 
      </Label.Content>      
     </Label> 
    </DockPanel> 
</DataTemplate>