2015-01-13 2 views
0

У меня есть WPF UserControl упаковка некоторых других элементов управления. Одним из них является ItemsControl, и мне нужно, чтобы сделать доступными в моем UserControl в Items собственности ItemsControl, так что я сделал следующее:Как сделать доступным в usercontrol внутреннюю коллекцию управления в Wpf?

public partial class MyControl : UserControl 
{ 
    private static readonly DependencyPropertyKey PagesPropertyKey = DependencyProperty.RegisterReadOnly("Pages", typeof(ObservableCollection<XXX>), typeof(MyControl), new FrameworkPropertyMetadata(new ObservableCollection<XXX>())); 

    public static DependencyProperty PagesProperty = PagesPropertyKey.DependencyProperty; 

    public ObservableCollection<XXX> Pages 
    { 
     get { return (ObservableCollection<XXX>) base.GetValue(PagesProperty); } 
     set { base.SetValue(PagesProperty, value); } 
    } 
} 

Затем в XAML ItemsControl имеет следующее:

ItemsSource="{Binding Pages, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:TypeExtension views1:MyControl}}}" 

Я думал, что это должно работать и на самом деле выглядит со Snoop UserControl, а у ItemsControl есть те же элементы, но когда я добавляю элементы непосредственно к внутреннему ItemsControl, первый элемент, который я добавляю, автоматически выбирается, и когда я делаю i t используя мой UserControl выбор не происходит, поэтому что-то не так.

Любые идеи?

EDIT: Элемент управления - это элемент управления Wizard, и мы используем его всегда с некоторыми другими элементами управления. Я создаю новый Usercontrol. Если я непосредственно использую Мастер в представлении Первого элемента атрибута ItemsSource автоматически выбирается, если я устанавливаю свойство ItemsSource мастера в свойство Pages, то при запуске нет выбранной страницы.

Я действительно удивляюсь, почему это происходит.

+0

вы можете выбрать из 'ItemsControl', а не просто' UserControl' –

+0

@ Vignesh.N: У меня есть несколько элементов управления, чтобы показать, что они не являются частью элемента ItemsControl. Элемент ItemsControl попытается нарисовать все, как ListBox, не так ли? –

ответ

0

Я решил его заменить привязка ItemsSource с вызовом конструктора:

this.ItemsControlInnerControl.ItemsSource = this.Pages; 

Нет ide почему это работает, а привязка не ... в любом случае ...

1

, если ваш пользовательский элемент управления только собирается быть ItemsControl вы можете извлечь из ItemsControl вместо UserControl

Также вы не видите пункт выбирается при использовании вашего UserControl, потому что, когда связывание происходит во время инициализации по умолчанию значение - пустая коллекция/null, поэтому SelectedItem составляет null во время инициализации элемента управления. Позже когда Pages свойство имеет свои значения, вам необходимо установить SelectedItem из вашего UserControl

FrameworkPropertyMetadata имеет другой конструктор, где указать PropretyChangedEventHandler где вы можете установить SelectedItem или SelectedIndex

public partial class MyControl : UserControl 
{ 
    private static readonly DependencyPropertyKey PagesPropertyKey = DependencyProperty.RegisterReadOnly("Pages", typeof(ObservableCollection<XXX>), typeof(MyControl), new FrameworkPropertyMetadata(null,OnPagesChanged)); 

    public static DependencyProperty PagesProperty = PagesPropertyKey.DependencyProperty; 

    public ObservableCollection<XXX> Pages 
    { 
     get { return (ObservableCollection<XXX>) base.GetValue(PagesProperty); } 
     set { base.SetValue(PagesProperty, value); } 
    } 
} 

     private static void OnPagesChanged(DependencyObject o, DependencyPropertyChangedEventArgs args) 
     { 
//play with DepedencyObject here; cast it to type MyControl and assign/change instance variables 
//Raise some events which can be bubbled. 
//Set SelectedIndex here 
     } 
+0

Да, я могу это сделать, но реальный вопрос в том, почему поведение меняется ... ¿? –

+0

У вас также есть свойство 'SelectedItem' для ваших элементов управления? Элемент 'ItemsControl' будет иметь свойство« SelectedItem », и всякий раз, когда« ItemsSource »изменяет элемент управления, изменяется« SelectedItem »(установка на первый). Аналогично, у вас есть свойство 'Pages', и вам может понадобиться' SelectedPage' и установить его в значение, которое не выполняется в настоящее время. –

+0

Я также обновил текст в своем ответе –

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