WPF:更新列表框项目中的标签

时间:2008-12-03 15:22:52

标签: wpf label controltemplate listboxitem

我有一个ListBox,其中根据用户设置的整数属性添加项目数。这些项目是从ControlTemplate资源创建的,该资源由标签和TextBox内的DockPanel组成。标签不是数据绑定的,但我希望它有一些基于ListboxItem所包含的({1}}的(索引+ 1)的动态内容。我的问题是,我希望能够为每个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>

我希望能够绑定xaml中Label的内容,或更新后面代码中Label的内容。我不确定最佳路线是什么。

2 个答案:

答案 0 :(得分:0)

更新:最初我试图像这样在模板中找到Label ....

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

我发现你必须先调用ApplyTemplate()才能构建模板的可视树,然后才能找到该元素。

答案 1 :(得分: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>