Пользовательский элемент управления ContentProperty DataBinding - PullRequest
1 голос
/ 02 марта 2011

Я столкнулся с проблемой при попытке использовать свойства зависимостей в объектах, которые являются частью коллекции, внутри пользовательского элемента управления, коллекции, идентифицируемой с помощью атрибута "ContentProperty".Хорошо, это неясно.Вот пример моего пользовательского элемента управления:

Вот базовое определение моего пользовательского элемента управления:

[ContentProperty("SmarSearchScopes ")]
public class SmartSearchCc : Control
{
    List<SmartSearchScope> SmarSearchScopes {get;set;}
    (more code here)
}

Вот базовое определение объекта SmartSearchScope:

public class SmartSearchScope : DependencyObject
{
    public static readonly DependencyProperty ViewProperty =DependencyProperty.Register("View", typeof (ICollectionView), typeof (SmartSearchScope),new UIPropertyMetadata(null,OnViewChanged));

    public static readonly DependencyProperty FilterColumnsProperty =DependencyProperty.Register("FilterColumns", typeof (IEnumerable<ColumnBase>), typeof (SmartSearchScope),new UIPropertyMetadata(null, OnFilterColumnsChanged));
    public ICollectionView View
    {
        get { return (ICollectionView) GetValue(ViewProperty); }
        set { SetValue(ViewProperty, value); }
    }

    public IEnumerable<ColumnBase> FilterColumns
    {
        get { return (IEnumerable<ColumnBase>) GetValue(FilterColumnsProperty); }
        set { SetValue(FilterColumnsProperty, value); }
    }
    (more code here)
}

И все это для чего?Возможность передавать коллекцию объектов SmartSearchScope через XAML, например, так:

<SmartSearch:SmartSearchCc HorizontalAlignment="Stretch" Grid.Row="0" >
    <SmartSearch:SmartSearchScope  FilterColumns="{Binding ElementName=CcyPairsConfigBlotter, Path=Columns}" View ="{Binding ElementName=CcyPairsConfigBlotter, Path=ItemsSource}"/>
    <SmartSearch:SmartSearchScope FilterColumns="{Binding ElementName=ClientConfigBlotter, Path=Columns}" View ="{Binding ElementName=ClientConfigBlotter, Path=ItemsSource}"/>
</SmartSearch:SmartSearchCc>

'ClientConfigBlotter' и 'CcyPairsConfigBlotter' - это всего лишь два элемента ItemControls, которые предоставляют d-свойство 'Columns' и 'ItemSource'.

Проблема здесь в том, что, хотя мои 2 объекта SmartSearchScope создаются, привязка данных в d-свойствах «View» и «FilterColumns» не выполняется, и я никогда не перебираю связанные с ними обратные вызовы.

Кроме того, вот сообщение об ошибке вывода, которое я получил при создании пользовательского элемента управления.

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=Columns; DataItem=null; target element is 'SmartSearchScope' (HashCode=56862858); target property is 'FilterColumns' (type 'IEnumerable`1')
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=ItemsSource; DataItem=null; target element is 'SmartSearchScope' (HashCode=56862858); target property is 'View' (type 'ICollectionView')

Очевидно, что я что-то упустил, но не могу найти что.

Я должен сказать, что в предыдущей версии этого элемента управления эти 2 проблемных d-свойства, где свойства SmartSearchCc и все это работали просто отлично.

Спасибо за вашу помощь:)

- bruno

Ответы [ 2 ]

1 голос
/ 02 марта 2011

У меня была похожая проблема: Привязки к дочернему объекту зависимости usercontrol не работают

Причина, по которой привязка не работает, заключается в том, что объекты DependencyObject не имеют свойства DataContext. В моем случае я изменил их для наследования от FrameworkElement, что решило проблему.

Хотя, как уже упоминал кто-то, изменение родительского элемента управления на ItemsControl может упростить ситуацию.

0 голосов
/ 02 марта 2011

Хорошо, проблема решена, я перехожу от моего основного настраиваемого элемента управления к элементу управления к ItemsControl, а наследование моего дочернего объекта - к элементу FrameWork, и все.Нет необходимости в дальнейших модификациях.

Спасибо всем за ваши предложения!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...