访问用户控件的子控件

时间:2011-06-06 05:46:16

标签: wpf user-controls

我创建了一个由扩展器,列表框和复选框组成的用户控件。我无法访问复选框(子控件),我想动态地根据表中的行数生成扩展器的数量。可以有人建议可能的解决方案

4 个答案:

答案 0 :(得分:2)

这非常模糊。在大多数情况下,您只需公开一些内部控件的属性,例如如果你想创建动态内容,你会暴露你使用的任何内部ItemsSource的{​​{1}}和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它没有选择),它已经定义了一个包含扩展器的ItemTemplate。您可能还可以创建一个部分模板,如我的this answer所示。

答案 1 :(得分:0)

听起来你需要浏览可视树。最简单的方法是通过Linq-to-VisualTree。要查找作为“this”子项的所有CheckBox,请使用以下查询:

IEnumerable<CheckBox> checks = this.Descendants<CheckBox>().Cast<CheckBox>();

答案 2 :(得分:0)

您的应用程序正在Application实例中运行。如果不是UI更新,请使用Application.usercontrol.ComponentName访问usercontrol组件。如果进行UI更新,则必须在单独的调度程序线程中运行访问。在这种情况下,请使用BackgroundWorker。

例如,我正在运行我的主应用程序类MainWindow并将其作为

访问它

MainWindow rootWindow = Application.Current.MainWindow as MainWindow;

现在访问组件的usercontrol和属性:

rootWindow.usercontrolX.ComponentY.PropertyZ

答案 3 :(得分:-1)

为每个控件定义子类的属性。假设您已在父用户控件中添加了子用户控件,您将能够从父用户控件访问它们。

父级用户控制.. 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)
        {
....