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 中,如何在运行时访问和填充该集合?

WPF:如何访问嵌套用户控件中的可观察集合

这是因为您的属性需要正确声明为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);
    }
}