Доступ к элементам управления в DataTemplate в ListBox в WPF - PullRequest
1 голос
/ 23 ноября 2011

У меня есть список, в котором есть DataTemplate.Я не могу получить доступ к элементам управления, которые размещены в табличке данных.Как я могу получить доступ к этому элементу управления?

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

Спасибо за внимание.

Ответы [ 3 ]

1 голос
/ 23 ноября 2011

Исходя из комментариев, я бы предложил вам создать модель представления, которая просто предоставляет свойство для видимости, например ::100100

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>
1 голос
/ 23 ноября 2011

Если вы все еще хотите получить доступ к своим элементам управления в 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();

Но я все еще настоятельно рекомендую провести рефакторинг вашей модели данных.

0 голосов
/ 25 мая 2017

Я использую этот подход для получения FrameworkElement из ItemsControl, также будет работать с 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);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...