2016-10-10 5 views
1

Я пишу UserControl, который я намерен использовать на нескольких страницах. Он должен инкапсулировать поведение одинаково для всех страниц. Но содержание и макет должны быть разными.Привязка DataTemplate в UserControl

В UserControl У меня есть ListView whoes ItemSource привязан к CollectionViewSource с включенной группировкой.

<ListView 
    ItemSource="{Binding Source={StaticResource Collection}}" 
    ItemTemplate="{Binding GroupedDataTemplate}"> 
    <ListView.GroupStyle> 
    <GroupSytele HeaderTemplate="{Binding HeaderDataTemplate}"/> 
    </ListView.GroupStyle> 
</ListView> 

UserControl имеет DependencyProperties "GroupedDataTemplate", "HeaderDataTemplate" для компоновки и одну "GroupedCollection" для данных.

На странице, где используется UserControl, я определил DataTemplates как:

<controls:MyUserControl 
    GroupedCollection="{Binding DataContext.MyDataCollection, ElementName=thePage}"> 
    <controls:MyUserControl.GroupedDataTemplate> 
    <DataTemplate> 
     <TextBlock Text="{Binding Description}"/> 
    </DataTemplate> 
    </controls:MyUserControl.GroupedDataTemplate> 
    <controls:MyUserControl.HeaderDataTemplate> 
    <DataTemplate> 
     <TextBlock Text="{Binding Key}"/> 
    </DataTemplate> 
    </controls:MyUserControl.HeaderDataTemplate> 
</controls:MyUserControl> 

Моя проблема в том, что определение DataTemplate для «GroupedDataTemplate» работает, как и ожидалось, описание отображается. Но для «HeaderDataTemplate» это не так, показано только представление ToString() объекта.

Вызывается установщик «HeaderDataTemplate» и DataTemplate назначается DependencyProperty UserControl.

Если я сам заменю UserControl на ListView, он работает как expceted. Таким образом, привязка работает с описанием и ключом, но она будет работать только для описания, если она находится внутри UserControl.

В целях тестирования я добавил конвертер к привязке Ключа на странице и его никогда не вызывают. Я все случаи, когда я определяю DataTemplate для ItemTemplate (ListView или GridView), он работает, но не для HeaderTemplate из GroupStyle.

В чем моя вина?

ответ

0

Очень хороший вопрос, мне кажется, когда вы используете Binding для HeaderTemplate из GroupSytele, в файл .g.cs из ваших UserControl, он не генерирует код для обновления HeaderDataTemplate, это означает, что при определении этого HeaderDataTemplate недвижимости например, например:

public static readonly DependencyProperty HeaderDataTemplateProperty = DependencyProperty.Register("HeaderDataTemplate", typeof(DataTemplate), typeof(UserGroupedListView), new PropertyMetadata(null)); 

public DataTemplate HeaderDataTemplate 
{ 
    get { return (DataTemplate)GetValue(HeaderDataTemplateProperty); } 
    set { SetValue(HeaderDataTemplateProperty, value); } 
} 

get никогда не вызывается.

Обходной здесь является то, что вы можете изменить Binding к x:Bind, как это в вашем UserControl:

<ListView ItemsSource="{Binding Source={StaticResource Collection}}" ItemTemplate="{Binding GroupedDataTemplate}"> 
    <ListView.GroupStyle> 
     <GroupStyle HeaderTemplate="{x:Bind HeaderDataTemplate}" /> 
    </ListView.GroupStyle> 
</ListView> 

В принципе вы не сделали ничего плохого, но это, кажется обязательным для HeaderTemplate из GroupStyle данных может работать только когда он использует x:Bind.

+0

Спасибо большое, отличное решение, даже потому, что я предпочитаю x: Bind. – Wernfried

+0

@Wernfried, thx! Так это приемлемый ответ? –

+0

@ GraceFeng-MSFT Означает ли это, что это ошибка в рамках UWP? –

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