我有包含DataTemplate的列表框。 我无法访问放在datatemplate中的控件。 如何访问此控件?
<ListBox Height="344" Name="listBoxMedicine" Width="881">
<ListBox.ItemTemplate>
<DataTemplate >
<TextBlock Name="myTextBlock">
</Datatemplate>
</ListBox.ItemTemplate>
</ListBox>
感谢您的关注。
答案 0 :(得分:1)
如果您仍想访问codebehaind中的控件,可以执行以下操作:
1)在某处添加一个新的辅助方法:
public static IEnumerable<Visual> ToVisualTree(this Visual visual)
{
yield return visual;
int numVisuals = VisualTreeHelper.GetChildrenCount(visual);
for (int i = 0; i < numVisuals; ++i)
{
var child = (Visual)VisualTreeHelper.GetChild(visual, i);
if (child == null) yield break;
foreach (var subItem in child.ToVisualTree())
{
yield return subItem;
}
}
}
2)像这样使用它:
var allTextBlocks = listBoxMedicine.ToVisualTree().OfType<TextBlock>().ToList();
但我仍然强烈建议您重构数据模型。
答案 1 :(得分:1)
根据评论,我建议您创建一个视图模型,它只提供可见性的属性,例如:
public class DataViewModel : INotifyPropertyChanged
{
private Data _data;
// Some data property.
public Data Data { get { return _data; } set { ... } }
private Visibility _visibility;
// The visibility property.
public Visibility Visibility { get { return _visibility; } set { ... } }
}
然后,您可以绑定该可见性,然后在代码中设置它以影响视图:
<DataTemplate >
<TextBlock Name="myTextBlock" Visibility="{Binding Visibility}">
</Datatemplate>
答案 2 :(得分:0)
我正在使用这种方法从ItemsControl获取FrameworkElement,也可以使用ListBox,ListView,因为它们都继承自ItemsControl。
private void CheckBounds(ItemsControl itemsControl)
{
foreach (var item in itemsControl.Items)
{
var child = ((FrameworkElement)itemsControl.ItemContainerGenerator.ContainerFromItem(item));
child.IsEnabled = child.IsControlVisible(itemsControl);
}
}