2016-02-19 2 views
0

в моем приложении Я использую два пользовательских элемента управления: UserControl1 является основным, внутри него я использую UserControl2 шесть раз.WPF: Как получить доступ к наблюдаемому коллекциям во вложенном usercontrol?

UserControl2 имеет несколько combobox, и я хотел бы их динамически заполнять из окончательного приложения. В начале я пытаюсь привязать данные к одному из них.

выпадающий в 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}"/> 

Я новичок, но здесь я не так уверен, как я получаю эту ошибку:

«Связывание» не может быть установлено в свойстве «VidTransformsNames» типа «UserControl1». «Связывание» может быть установлено только на DependencyProperty объекта DependencyObject.

Как я могу получить доступ и выполнить во время выполнения наблюдаемый сборник UserControl2, если он вложен в UserControl1?

ответ

1

Это потому, что ваше имущество должно быть объявлено правильно, как DependencyProperty

свойство зависимостей и система свойств WPF расширить свойству функциональности, предоставляя тип, который создает резервные свойства, как альтернативной реализации к стандарту образец поддержки недвижимость с частным полем. Имя этого типа: DependencyProperty. Другим важным типом, который определяет систему свойств WPF , является DependencyObject. DependencyObject определяет базовый класс , который может регистрировать и владеть свойством зависимостей.

Пожалуйста, проследуйте https://msdn.microsoft.com/library/ms753358(v=vs.100).aspx или Dependency Обзор недвижимости 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); 
    } 
} 
+0

Что недвижимости Вы говорите точно? следует ли использовать DependencyProperty вместо ObservableCollection? – lecloneur

+0

Вам нужно создать 'public static readonly DependecyProperty YourName', а затем зарегистрировать его правильно.В регистрационной части вам нужно будет добавить в ваш случай 'typeof (ObservableCollection )' – MadOX

+0

действительно, это работает сейчас. Я не знал, что наблюдаемый сбор может быть типом зависимости. Спасибо за вашу помощь. – lecloneur

Смежные вопросы