Задать вопрос
Android97
@Android97
Бэкенд и немного фронтенд разработчик

Как пробросить свойство из контрола WPF?

Есть вот такое свойство у моего контрола
public ObservableCollection<object> Items
        {
            get => (ObservableCollection<object>)GetValue(ItemsProperty);
            set
            {
                SetValue(ItemsProperty, value);       
            }
        }


Еще есть статический конструктор с DependencyProperty
public static readonly DependencyProperty ItemsProperty;

        
        static FilteredListBox()
        {
            ItemsProperty = DependencyProperty.Register("Items",
                                                       typeof(ObservableCollection<object>),
                                                       typeof(FilteredListBox),
                                                       new FrameworkPropertyMetadata(new ObservableCollection<object>(),
                                                                                     FrameworkPropertyMetadataOptions
                                                                                             .AffectsMeasure
                                                                                     | FrameworkPropertyMetadataOptions
                                                                                             .AffectsRender,
                                                                                     new PropertyChangedCallback(OnItemsChanged)));
        }


И в разметке контрола есть лист бокс, который привязывается к свойству контрола.
<ListBox Name="_listBox"
                 ItemsSource="{Binding Items}" 
        />

Когда использую свой контрол на форме, привязка не работает, т.е. в коллекцию добавляются элементы. но они не появляются в списке.
<ctrls:MyListBox Items="{Binding Departments}"/>

Как правильно пробросить свойство из контрола ?
  • Вопрос задан
  • 304 просмотра
Подписаться 2 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
@LootKeeper
Попробуй в самом UserControl в ListBox указать привязку так:

<ListBox Name="_listBox"
                 ItemsSource="{Binding Items, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}" 
        />


Вообще, если ты делаешь проект "для себя", то проще это всё делать через Mvvm паттерн. Привязки в таком случае очень удобно делать, и можно обходиться без DependencyProperty, и писать всю логику в ViewModel для нужного UC.
Ответ написан
lam0x86
@lam0x86
Во-первых, надо использовать TemplateBinding (ведь вы темплейт переопределили для своего контрола?)
Во-вторых, в метадате нельзя писать "new ObservableCollection()", т.к. все ваши контроллы будут ссылаться на одну и ту же коллекцию.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы