Доступ к дочернему элементу управления пользователя - PullRequest
3 голосов
/ 06 июня 2011

Я создал пользовательский элемент управления, который состоит из расширителя, списка и флажков.Я не могу получить доступ к флажкам (дочерний элемент управления) и хочу динамически сгенерировать количество расширителей на основе количества строк в таблице.Может кто-нибудь предложить возможные решения

Ответы [ 4 ]

2 голосов
/ 06 июня 2011

Это очень расплывчато.В большинстве случаев вы просто выставляете некоторые свойства внутреннего элемента управления, например, если вы хотите создать динамический контент, вы бы выставили ItemsSource и ItemTemplate внутреннего ListBox того, что вы используете, чтобы его можно было установить извнеНапример,

<UserControl x:Class="Test.UserControls.Bogus" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" Name="control">
    <StackPanel>
        <TextBlock Text="Lorem Ipsum:" />
        <ItemsControl ItemsSource="{Binding ElementName=control, Path=ItemsSource}"
                ItemTemplate="{Binding ElementName=control, Path=ItemTemplate}" />
    </StackPanel>
</UserControl>
public partial class Bogus : UserControl
{
    public static readonly DependencyProperty ItemsSourceProperty = ItemsControl.ItemsSourceProperty.AddOwner(typeof(Bogus));
    public IEnumerable ItemsSource
    {
        get { return (IEnumerable)GetValue(ItemsSourceProperty); }
        set { SetValue(ItemsSourceProperty, value); }
    }

    public static readonly DependencyProperty ItemTemplateProperty = ItemsControl.ItemTemplateProperty.AddOwner(typeof(Bogus));
    public DataTemplate ItemTemplate
    {
        get { return (DataTemplate)GetValue(ItemTemplateProperty); }
        set { SetValue(ItemTemplateProperty, value); }
    }

    public Bogus()
    {
        InitializeComponent();
    }
}

Использование:

<uc:Bogus ItemsSource="{Binding Data}">
    <uc:Bogus.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name}" Foreground="Red" />
        </DataTemplate>
    </uc:Bogus.ItemTemplate>
</uc:Bogus>

Конечно, вы также можете инкапсулировать много логики, которая вам не нужна.

Если вам нужно различное количество расширителей, у вас может быть ItemsControl (в отличие от ListBox у него нет выбора), который уже определяет шаблон элемента ItemTemplate, который содержит расширитель.Вы, вероятно, также можете создать частичный шаблон, как показано в моего ответа моего.

0 голосов
/ 03 июля 2012

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

родительский пользовательский элемент управления. SingalData - это дочерний пользовательский контроль

<my:C1TabItem Header="Signal">
        <local:SignalData Width="1036" OnSignalNameChange="SignalInputTab_OnSignalNameChange" Loaded="SignalInputTab_Loaded" Height="353" VerticalAlignment="Top" MinHeight="353" HorizontalAlignment="Left"></local:SignalData>

В классе Child User Contorl, если у вас есть компонент с именем tabProductList, вы добавляете свойство -

public C1.WPF.C1TabControl TabProductList
{
    get { return this.tabProductList; }
}

И, наконец, из своего родительского класса вы можете ссылаться на него как -

C1TabItem tbItem = (C1TabItem)c1TabControl1.SelectedItem;
SignalData sigInp = (SignalData)tbItem.Content;
if (sigInp.TabProductList.SelectedIndex == 0)
        {
....
0 голосов
/ 06 июня 2011

Ваше приложение работает в экземпляре приложения. Получите доступ к компонентам usercontrol с помощью Application.usercontrol.ComponentName, если это не обновление пользовательского интерфейса. Если вы делаете обновления пользовательского интерфейса, вы должны запустить доступ в отдельном потоке диспетчера. В этом случае используйте BackgroundWorker.

Например, я запускаю свой основной класс приложения MainWindow и обращаюсь к нему как

MainWindow rootWindow = Application.Current.MainWindow as MainWindow;

Теперь получите доступ к пользовательскому контролю и свойствам компонентов как:

rootWindow.usercontrolX.ComponentY.PropertyZ

0 голосов
/ 06 июня 2011

Похоже, вам нужно перемещаться по визуальному дереву.Самый простой способ сделать это через Linq-to-VisualTree .Чтобы найти все флажки, которые являются дочерними для этого, используйте следующий запрос:

IEnumerable<CheckBox> checks = this.Descendants<CheckBox>().Cast<CheckBox>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...