C# Can';t访问列表框数据模板项
我有这个XAML代码,我想访问AccountNameTextBox或下面的elipse几行,以便通过在名称旁边添加一些内容(例如YouTube(expired))或将elipse变为红色来显示列表中的某些帐户已过期。问题是我无法访问它们。我已经尝试使用我在这里看到的VisualTreeHelper函数 甚至试着创造一些我自己的,但没有任何效果。我注意到,当我在accountListBox上使用“VirtualTreeHelper.GetChild”时,输出是一个边框控件,它是唯一的子控件。 代码如下C# Can';t访问列表框数据模板项,c#,xaml,listbox,C#,Xaml,Listbox,我有这个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)检查
我个人的偏好是使用触发器的解决方案,但这取决于您。非常感谢今晚我将检查您的解决方案。我选择了代码方法,因为我已经有了一个静态帮助器类型的类,它可以很好地适应,而且工作起来很有魅力。如果我可以添加的话,代码也非常简洁。