2011-06-06 79 views
3

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

回答

0

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

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

这非常含糊。在大多数情况下,您只会公开一些内部控制的属性,例如如果你想创建动态内容,你可以暴露内部ListBoxItemsSourceItemTemplate,因为它可以从外部设置,例如,

<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。您可能也可以创建一个部分模板,如我的this answer中所示。

+0

这真的帮了我很大的忙,所以要了解我们正在创建一个父项的依赖属性,孩子可以访问? – 2014-07-29 10:57:44

+1

@MichaelHarper:这不是真正的亲子关系,更多的是关于内外。一个创建依赖属性并在内部绑定它们,以便可以从外部转发数据。 “UserControl”定义的XAML中的所有内容都是从外部隐藏起来的,除非绑定到UserControl的公共属性上。 – 2014-07-29 14:12:57

+0

这是有道理的,所以我们通过在外部/包装用户控件上创建一个属性来访问内部用户控件(列表/网格等) – 2014-07-30 16:20:48

0

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

例如,我正在我的主应用程序类主窗口和访问它,

MainWindow rootWindow = Application.Current.MainWindow as MainWindow;

现在可以访问组件的用户控件和属性:

rootWindow.usercontrolX.ComponentY.PropertyZ

-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> 

在儿童用户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) 
     { 
....