Использование Canvas в качестве ItemsPanelTemplate и Binding Canvas.Top не работает

Прежде всего я пишу приложение для Магазина Windows для Windows 8 с использованием C# и XAML. Я использую GridView для отображения сгруппированной коллекции объектов. Каждая группа отображается в виде одного столбца, в котором отображаются связанные элементы.

Это отлично работает, но я хочу ItemsPanel каждого столбца, чтобы быть Canvas Панель.

<GroupStyle.Panel>
    <ItemsPanelTemplate>
        <Canvas />
    </ItemsPanelTemplate>
</GroupStyle.Panel>

Теперь я установил Canvas.Top на статический номер прямо в XAML. Это работает как ожидалось.

<GridView.ItemContainerStyle>
    <Style TargetType="GridViewItem">
        <Setter Property="Canvas.Top" Value="50" />
    </Style>
</GridView.ItemContainerStyle>

Но если я использую привязку данных, это не работает.

<Setter Property="Canvas.Top" Value="{Binding Distance}" />

Не работает ли привязка к стилям и сеттерам в разработке приложений для Магазина Windows 8 с помощью Visual Studio 2012? Как я могу это исправить, чтобы я мог динамически устанавливать Canvas.Top для каждого элемента из свойства?

2 ответа

Привязка в установщиках стилей не поддерживается в WinRT, подобно Silverlight до версии 5. Смотрите этот ответ, который также относится к привязке в ItemContainerStyle (Обходной путь предлагается с некоторыми прикрепленными свойствами).

В качестве альтернативы вы можете установить значение свойства / привязку в коде при создании контейнера элемента - подкласс GridView и переопределить что-то вроде ItemsControl.PrepareContainerForItemOverride, чтобы установить привязки из контейнера элемента к элементу модели.

Кажется, что привязка свойства в стилях к ViewModel недоступна.
Canvas.Top является своего рода прикрепленным свойством.
Если вы хотите динамически изменить свойство каждого элемента Canvas.Top Вы можете сделать это в коде позади.
Извлечь каждый GridViewItem"s Canvas а затем установите его свойство Top.

Другие вопросы по тегам