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