WPF: обновить метку в элементе списка - PullRequest
0 голосов
/ 03 декабря 2008

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

<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 в приведенном ниже коде. Я не уверен, какой будет лучший маршрут.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2008

Вы должны создать 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>
0 голосов
/ 03 декабря 2008

ОБНОВЛЕНИЕ: Первоначально я пытался найти Label в шаблоне, как это ....

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

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

...