我有一个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
的内容。我不确定最佳路线是什么。
答案 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>