0

ListBoxユーザーが設定した整数プロパティに基づいてアイテムの数が追加される場所があります。アイテムはControlTemplate、Label と のTextBox内部で構成されるリソースから作成されDockPanelます。ラベルはデータにバインドされていませんが、ラベルが含まれているの (インデックス + 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>

xaml のコンテンツをバインドしたり、コード ビハインドLabelのコンテンツを更新したりしたいと考えています。Labelどのルートが最適かはわかりません。

4

2 に答える 2

0

Label更新: 最初は、このようなテンプレートでを見つけようとしていました....

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

ApplyTemplate()要素を見つける前に、テンプレートのビジュアル ツリーを構築するために呼び出す必要があることがわかりました。

于 2008-12-03T17:17:59.207 に答える
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>
于 2008-12-04T00:13:53.597 に答える