WPF:如何访问嵌套用户控件中的可观察集合
本文关键字:控件 用户 集合 观察 嵌套 何访问 访问 WPF | 更新日期: 2023-09-27 18:35:23
在我的应用程序中,我使用了两个用户控件:UserControl1是主要的,在其中,我使用了六次UserControl2。
UserControl2 有几个组合框,我想从最终应用程序动态填充它们。首先,我正在尝试将数据绑定到其中之一。
UserControl2 中的组合框如下所示:
<ComboBox x:Name="VidTransform" Template="{DynamicResource BaseComboBoxStyle}" ItemContainerStyle="{DynamicResource BaseComboBoxItemStyle}" Grid.Row="1" ItemsSource="{Binding Path=DataContext.VidTransformsNames,ElementName=Ch_Parameters, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" SelectedValue="{Binding Path=SelectedTransform,ElementName=Ch_Parameters, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
目前我只能使用此可观察集合手动填充它(所有字符串都正确显示):
private ObservableCollection<string> _VidTransformsNames = new ObservableCollection<string>(new[] { "test0", "test1", "test2", "test3", "test4", "test5" });
public ObservableCollection<string> VidTransformsNames
{
get { return _VidTransformsNames; }
set { _VidTransformsNames = value; }
}
在 UserControl1(包含 UserControl2)中,我尝试创建一个其他 ObservableCollection,并在运行时在我的最终应用程序中动态填充它。
在这里:
private ObservableCollection<string> _VideoTransformsNames = new ObservableCollection<string>(new[] { "Test0", "Test1", "Test2", "Test3", "Test4", "Test5" });
public ObservableCollection<string> VideoTransformsNames
{
get { return _VideoTransformsNames; }
set { _VideoTransformsNames = value; }
}
然后绑定:
<local:UserControl1 VidTransformsNames="{Binding Path=VideoTransformsNames, ElementName=cmix, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
我是初学者,但在这里我肯定错了,因为我收到此错误:
不能在类型为"UserControl1"的"VidTransformsNames"属性上设置"绑定"。"绑定"只能在依赖对象的依赖属性上设置。
如果用户控制 2 嵌套在用户控制 1 中,如何在运行时访问和填充该集合?
这是因为您的属性需要正确声明为DependencyProperty
依赖项属性和 WPF 属性系统扩展属性 功能,通过提供支持属性的类型作为 支持标准模式的替代实现 带私人场地的物业。此类型的名称为 依赖属性。定义 WPF 的另一个重要类型 属性系统是 DependencyObject。依赖对象定义基础 可以注册并拥有依赖项属性的类。
请按照此 https://msdn.microsoft.com/library/ms753358(v=vs.100).aspx或依赖项属性概述 https://msdn.microsoft.com/pl-pl/library/ms752914(v=vs.100).aspx
示例取自上述文章:
public static readonly DependencyProperty IsSpinningProperty =
DependencyProperty.Register(
"IsSpinning", typeof(Boolean),
...
);
public bool IsSpinning
{
get { return (bool)GetValue(IsSpinningProperty); }
set { SetValue(IsSpinningProperty, value); }
}
让我们尝试将其设置为您的代码:
public static readonly DependencyProperty VideoTransformsNamesProperty =
DependencyProperty.Register("VideoTransformsNames", typeof(ObservableCollection<string>), typeof(UserControl1));
public string VideoTransformsNames
{
get
{
return this.GetValue(VideoTransformsNamesProperty) as ObservableCollection<string>;
}
set
{
this.SetValue(VideoTransformsNamesProperty, value);
}
}