在WPF中的ListBox中访问DataTemplate中的控件

时间:2011-11-23 11:40:12

标签: c# wpf xaml wpf-controls datatemplate

我有包含DataTemplate的列表框。 我无法访问放在datatemplate中的控件。 如何访问此控件?

<ListBox Height="344" Name="listBoxMedicine" Width="881">
    <ListBox.ItemTemplate>
        <DataTemplate >
            <TextBlock Name="myTextBlock">
        </Datatemplate>
    </ListBox.ItemTemplate>
</ListBox>

感谢您的关注。

3 个答案:

答案 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);
        }
    }