2

Мне нравится делиться списком между приложением и пользовательским Usercontrol. Я использую IEnumerable как вложенное свойство, чтобы предоставить список Listbox внутри пользовательского UserControl. Затем ListBox получает прикрепленное свойство как ItemsSource. Это работает до сих пор. Но когда список хостов изменяется, список внутри usercontrol должен обновляться. Как я могу это достичь? Текущий код устанавливает список Usercontrol, но когда хост изменяет список, вложенное свойство не будет обновляться.wpf прикрепленное свойство с коллекцией не обновляется

Хост, который использует UserControl имеет ComboBox, который должен поделиться своим ItemsSource с ListBox в UserControl в

public ObservableCollection<Person> PersonList 
    { 
     get; 
     set; 
    } 

Xaml хозяина связывает ComboBox к коллекции:

<ComboBox x:Name="combobox1" Width="200" ItemsSource="{Binding PersonList}" DisplayMemberPath="Name" SelectedIndex="0" IsEditable="True"></ComboBox> 

UserControl, который размещается внутри хоста, получает сбор через прикрепленное свойство. Связывание выглядит тяжелым, но, кажется, хорошо:

<myUserCtrl:AdvEditBox 
    ... 
prop:DynamicListProvider.DynamicList="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, 
         Path=DataContext.PersonList}"> 
    ... 
</myUserCtrl:AdvEditBox 

вложенное свойство имеет функцию обратного вызова, которая в настоящее время получает вызывается только один раз:

class DynamicListProvider : DependencyObject 
{ 
    public static readonly DependencyProperty DynamicListProperty = DependencyProperty.RegisterAttached(
     "DynamicList", 
     typeof(IEnumerable), 
     typeof(DynamicListProvider), 
     new FrameworkPropertyMetadata(null, OnDynamicListPropertyChanged))); 

    public static IEnumerable GetDynamicList(UIElement target) {..} 

    public static void SetDynamicList(UIElement target, IEnumerable value) {..} 

    private static void OnDynamicListPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) 
    { 
     if (e.NewValue != null && o is FrameworkElement) 
     { 
      ... 
     } 
    } 

OnDynamicListPropertyChanged() должна вызываться всякий раз, когда PersonList изменений хозяевах , Должен ли я вводить INotifyCollectionChanged внутри прикрепленного свойства? Если да, то где и как?

+0

У меня точно такой же вопрос сейчас. –

+0

Я выложу свое решение. Дайте мне знать, если это поможет. – deafjeff

ответ

1

вот мое решение:

1) Д.П. UserControl в:

public static readonly DependencyProperty SelectionListProperty = DependencyProperty.Register(
     "SelectionList", 
     typeof(ObservableCollection<MyList>), 
     typeof(MyUserControl), 
     new UIPropertyMetadata(null)); 

(..add свойство прибудете/комплект обертка)

2) установить ваши UserControls ItemsSource в списке, например,

_combobox.ItemsSource = SelectionList; 

3) хозяин владеет списком. Добавьте данные и их свойство в класс, который создает экземпляр usercontrol. В моем случае я использую привязку readonly/oneway.

ObservableCollection<MyList> _bigList= new ObservableCollection<MyList>(); 
public ObservableCollection<MyList> BigList 
    { 
     get { return _bigList; } 
    } 

4) набор привязки в XAML

<myctrl:MyUserControl 
    SelectionList="{Binding BigList, Mode=OneWay}" 
    ... 
/> 

5) Теперь, когда вы изменяете _biglist, называешь PropertyChangedEventHandler на "BigList". Это будет уведомлять SelectionList UserControl как установленное привязкой и вызвать BigList get {}. Надеюсь, вам это ясно.

+0

благодарю вас за столь быстрое предоставление вашего разрешения. На самом деле мой код почти такой же, как ваш ответ, странно, когда я меняю/добавляю/удаляю BigList в режиме просмотра, OnDynamicListPropertyChanged вообще не запускается. Только когда я создаю новый BigList, это будет событие. –

+0

В моем решении обратный вызов OnDynamicListPropertyChanged() больше не нужен. Но то, с чем вы сталкиваетесь, вероятно, что вы не называете raisepropertyChanged(). Когда вы создаете BigList, propertychanged будет вызываться один раз. Если вы не хотите вручную ссылаться на свойствоchanged, вы должны обработать событие CollectionChanged вашего _bigList, и там вы вызываете RaisePropertyChanged на «BigList».Это связано с привязкой свойств коллекции в usercontrol. – deafjeff

+0

nono, если я привяжу те же самые элементы к элементу ListSource ListBox, то изменения в ViewModel автоматически повысят события и обновят пользовательский интерфейс. Даже не работает после того, как я внедрил InotifyPropertyChanged. Хорошо, я вижу, что вы только привязываете его один раз, а не тот же вопрос. Все же разрешите поблагодарить вас. –