C# Can';t访问列表框数据模板项

C# Can';t访问列表框数据模板项,c#,xaml,listbox,C#,Xaml,Listbox,我有这个XAML代码,我想访问AccountNameTextBox或下面的elipse几行,以便通过在名称旁边添加一些内容(例如YouTube(expired))或将elipse变为红色来显示列表中的某些帐户已过期。问题是我无法访问它们。我已经尝试使用我在这里看到的VisualTreeHelper函数 甚至试着创造一些我自己的,但没有任何效果。我注意到,当我在accountListBox上使用“VirtualTreeHelper.GetChild”时,输出是一个边框控件,它是唯一的子控件。 代码

我有这个XAML代码,我想访问AccountNameTextBox或下面的elipse几行,以便通过在名称旁边添加一些内容(例如YouTube(expired))或将elipse变为红色来显示列表中的某些帐户已过期。问题是我无法访问它们。我已经尝试使用我在这里看到的VisualTreeHelper函数 甚至试着创造一些我自己的,但没有任何效果。我注意到,当我在accountListBox上使用“VirtualTreeHelper.GetChild”时,输出是一个边框控件,它是唯一的子控件。 代码如下

`<StackPanel x:Name="MainStackPanel" Grid.Row="1" Grid.RowSpan="2" DataContext="{StaticResource ResourceKey=accountManager}">
            <ListBox x:Name="accountListBox" ItemsSource="{Binding LoadedAccounts}" Height="600" VerticalAlignment="Bottom" Margin="10,10" Background="Transparent" DoubleTapped="accountListBox_DoubleTapped" ScrollViewer.VerticalScrollBarVisibility="Auto">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Margin="10,0,0,0">
                            <TextBlock x:Name="AccountNameTextBox" Text="{Binding AccountName}" FontFamily="Segoe Script" FontSize="30" Foreground="White"/>
                            <StackPanel Orientation="Horizontal">
                                <StackPanel>
                                    <!--<TextBlock Text="{Binding Username}" FontSize="25" Foreground="Lime"/>-->
                                    <TextBlock Text="{Binding Email}" FontStyle="Italic" FontSize="25" Foreground="DarkSeaGreen"/>
                                    <TextBlock Text="{Binding Password}" FontSize="25" Foreground="YellowGreen"/>
                                </StackPanel>
                                <Ellipse x:Name="Elipse" Height="Auto" Width="10" Margin="10,0">
                                    <Ellipse.Fill>
                                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                            <GradientStop Color="YellowGreen" Offset="0"/>
                                            <GradientStop Color="White" Offset="1"/>
                                        </LinearGradientBrush>
                                    </Ellipse.Fill>
                                </Ellipse>
                            </StackPanel>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </StackPanel>`
`
`

为什么不使用触发器或转换器? 为此,您必须向绑定项添加一个属性(我称之为我的IsExpired)

然后在DataTemplate中添加DataTrigger:

<DataTemplate.Triggers>
    <DataTrigger Binding="{Binding IsExpired}" Value="True">
        <Setter Property="Visibility" Value="Visible" TargetName="ExpiredTextBlock" />
        <Setter Property="Fill" Value="Red" TargetName="Elipse" />
    </DataTrigger>
</DataTemplate.Triggers>


使用converter的一种可能性是向DataTemplate添加转换器资源:

<DataTemplate.Resources>
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
</DataTemplate.Resources>

然后将(过期的)TextBlock添加到DataTemplate并绑定到属性

<TextBlock Text="(Expired)" Visibility="{Binding IsExpired, Converter={StaticResource BooleanToVisibilityConverter}}"/>

对于颜色,您可以使用BooleanToColorConverter执行相同的操作


如果你想坚持你的代码方法,你必须深入你的视觉树:

public static T GetChildOfType<T>(this DependencyObject depObj) 
    where T : DependencyObject
{
    if (depObj == null) return null;

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
    {
        var child = VisualTreeHelper.GetChild(depObj, i);

        var result = (child as T) ?? GetChildOfType<T>(child);
        if (result != null) return result;
    }
    return null;
}
public static T GetChildOfType(此DependencyObject depObj)
其中T:DependencyObject
{
if(depObj==null)返回null;
for(int i=0;i
此helper方法查找给定类型的第一个子级。 如果要按名称查找,则必须使用名称作为参数,而不是泛型类型,并用名称检查替换(子项为T)检查


我个人的偏好是使用触发器的解决方案,但这取决于您。

非常感谢今晚我将检查您的解决方案。我选择了代码方法,因为我已经有了一个静态帮助器类型的类,它可以很好地适应,而且工作起来很有魅力。如果我可以添加的话,代码也非常简洁。