Нахождение управления в WPF itemscontrol

Ах, радости от попытки получить доступ к сетевым ресурсам с удаленного компьютера. Вы потеряете все, что связано с учетной записью домена, делая то, что вы делаете. Это просто, как это работает. Хорошей новостью является то, что есть еще способ получить нужную информацию, и вы даже можете использовать Get-WmiObject, чтобы сделать это, если хотите. Если вы еще не переименовали группу «Администраторы» (потому что на самом деле, кто это делает?), Вы можете сделать это легко, но если вы это сделали и вам нужно искать группу по SID, как вы выше, вам придется запросить удаленный сервер, как вы, и внесите коррективы с помощью запроса ниже с измененным именем, которое вы получите. Вот что я бы порекомендовал сделать, используя вместо этого класс Win32_GroupUser:

Get-WmiObject -ComputerName $Server -Query "SELECT * FROM win32_GroupUser WHERE GroupComponent = ""Win32_Group.Domain='$computerName',Name='Administrators'"""

Чтобы поставить его вместо того, что вы используете для своей функции, он может выглядеть примерно так:

function Get-LocalAdminGroupMember {
    param(
        [String] $computerName,
        [System.Management.Automation.PSCredential] $credential
    )
    $params = @{
        "ComputerName" = $computerName
        "Query" = "SELECT * FROM win32_GroupUser WHERE GroupComponent = ""Win32_Group.Domain='$computerName',Name='Administrators'"""
    }
    if ( $credential ) {
        if ( $computerName -eq [Net.Dns]::GetHostName() ) {
        Write-Warning "The -Credential parameter is ignored for the current computer."
        }
        else {
        $params.Add("Credential", $credential)
        }
    }
    Get-WmiObject @params | 
        Where{

Ах, радости от попытки получить доступ к сетевым ресурсам с удаленного компьютера. Вы потеряете все, что связано с учетной записью домена, делая то, что вы делаете. Это просто, как это работает. Хорошей новостью является то, что есть еще способ получить нужную информацию, и вы даже можете использовать Get-WmiObject, чтобы сделать это, если хотите. Если вы еще не переименовали группу «Администраторы» (потому что на самом деле, кто это делает?), Вы можете сделать это легко, но если вы это сделали и вам нужно искать группу по SID, как вы выше, вам придется запросить удаленный сервер, как вы, и внесите коррективы с помощью запроса ниже с измененным именем, которое вы получите. Вот что я бы порекомендовал сделать, используя вместо этого класс Win32_GroupUser:

[110]

Чтобы поставить его вместо того, что вы используете для своей функции, он может выглядеть примерно так:

[111].PartComponent -match ':(.+?)\.Domain="(.+?)",Name="(.+?)"'}| ForEach{ [PSCustomObject]@{ "ComputerName"=$computerName "Name"='Administrators' "Member"=$Matches[2..3] -join '\' -replace "^$computerName\\" "Type"=$Matches[1] } } }
22
задан Dirk Vollmar 11 July 2012 в 06:56
поделиться

4 ответа

Используя ItemContainerGenerator, вы можете получить сгенерированный контейнер для элемента и пройти по визуальному дереву вниз, чтобы найти ваш TextBox. В случае ItemsControl это будет ContentPresenter, но ListBox вернет ListBoxItem, ListView a ListViewItem и т. Д.

ContentPresenter cp = itemsControl.ItemContainerGenerator.ContainerFromItem(item) as ContentPresenter;
TextBox tb = FindVisualChild<TextBox>(cp);
if (tb != null)
{
    // do something with tb
}

public static T FindVisualChild<T>(DependencyObject depObj) where T : DependencyObject
{
    if (depObj != null)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
            if (child != null && child is T)
            {
                return (T)child;
            }

            T childItem = FindVisualChild<T>(child);
            if (childItem != null) return childItem;
        }
    }
    return null;
}

Вы также можете получить контейнер по индексу, если хотите, используя

itemsControl.ItemContainerGenerator.ContainerFromIndex(0);
68
ответ дан 29 November 2019 в 03:31
поделиться

Вы можете попробовать использовать VisualTreeHelper . Свойства самого ItemsControl позволят вам получить только данные, к которым он привязан, но не экземпляры шаблонов, используемые для визуализации данных, в то время как VisualTreeHelper позволяет просматривать визуальное дерево по мере его визуализации WPF.

Если вы выполняете итерацию через визуальных дочерних элементов родительского ItemControl (рекурсивно), у вас не должно возникнуть проблем с поиском текстовых полей, которые вы видите на экране.

2
ответ дан 29 November 2019 в 03:31
поделиться

Thanks Bryce, I tried to tick the up arrow but it says my rating is too low! Sorry!

I amended the code to return all a list of all the children of the given type as it was what I needed and thought someone else might find it useful.

Thanks again Bryce, really helpful - sorry about the rating thing!

public static List<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
    {
        List<T> list = new List<T>();
        if (depObj != null)
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
            {
                DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
                if (child != null && child is T)
                {
                    list.Add((T)child);
                }

                List<T> childItems = FindVisualChildren<T>(child);
                if (childItems != null && childItems.Count() > 0)
                {
                    foreach (var item in childItems)
                    {
                        list.Add(item);
                    }
                }
            }
        }
        return list;
    }
5
ответ дан 29 November 2019 в 03:31
поделиться

Если у вас есть грид данных и колонка шаблона, которая содержит шаблон данных, вы можете использовать следующий пример кода

<DataGridTemplateColumn x:Name="photoPathColumn" Header="{x:Static resx:FrmResource.Photo}">
    <DataGridTemplateColumn.CellEditingTemplate x:Uid="keyelm">
        <DataTemplate x:Name="dodo">
            <StackPanel Orientation="Horizontal" Height="Auto">
                <TextBlock x:Name="photo" x:Uid="imageFile" Text="{Binding Path=PhotoPath}" />
                <Button x:Name="Browse" Content="..." Click="Browse_Click" />
            </StackPanel>
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>

photoPathColumn.CellEditingTemplate.FindName("photo",photoPathColumn.GetCellContent(CustomersDataGrid.CurrentItem)) 
0
ответ дан 29 November 2019 в 03:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: