在我的应用程序中我使用了两个usercontrol: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}"/>
目前我只能手动填充它,使用此ObservableCollection(所有字符串都正确显示):
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”属性上设置“绑定”。 '绑定'只能在DependencyObject的DependencyProperty上设置。
如果UserControl2嵌套在UserControl1中,如何在运行时访问并填充UserControl2的observablecollection?
答案 0 :(得分:1)
这是因为您的属性需要正确声明为DependencyProperty
依赖项属性和WPF属性系统扩展属性 通过提供支持属性的类型的功能,作为 支持标准模式的替代实现 带私人场地的酒店。这种类型的名称是 的DependencyProperty。定义WPF的另一种重要类型 属性系统是DependencyObject。 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);
}
}