Свяжите сгруппированную коллекцию в Xaml
Я искал немного, но информация, которую я нашел, не то, что мне нужно. Поэтому я решил задать вам все - я уверен, что это вопрос новичка, но я действительно не понимаю его. Давайте начнем: у меня есть DataSource, который является сгруппированной наблюдаемой коллекцией. На данный момент у меня 2 группы с разным количеством предметов. Две группы и элементы принадлежат одной общей базе:
public DataCommon(String uniqueId, String title, String subtitle, String imagePath, String description)
{
this._uniqueId = uniqueId;
this._title = title;
this._subtitle = subtitle;
this._description = description;
this._imagePath = imagePath;
}
Это конструктор модели. В ViewModel я его заполняю. Теперь я хотел бы привязать ItemClick с помощью команды к моей ViewModel. Мне нравится это (только короткая часть):
<GridView
x:Name="itemGridView"
AutomationProperties.AutomationId="ItemGridView"
AutomationProperties.Name="Grouped Items"
Grid.RowSpan="2"
Padding="116,137,40,46"
ItemsSource="{Binding Source={StaticResource groupedItemsViewSource}}"
ItemTemplate="{StaticResource Standard250x250ItemTemplate}"
SelectionMode="None"
IsSwipeEnabled="false"
IsItemClickEnabled="True"
>
<WinRtBehaviors:Interaction.Behaviors>
<Win8nl_Behavior:EventToCommandBehavior Event="ItemClick" Command="ItemClickCommand" CommandParameter="{Binding UniqueId}"/>
</WinRtBehaviors:Interaction.Behaviors>
Но сейчас проблема. В "Binding UniqueId" говорится, что DataContext - это моя ViewModel, поэтому я не могу подключить его к свойствам модели. Посмотрел Page.DataContext, который я сказал XAML, чтобы использовать мою ViewModel в качестве DataContext. Я думаю, это было правильно. Но как я могу получить доступ к свойствам модели? Я попытался сделать это так (определил мою модель как DataModel):
<WinRtBehaviors:Interaction.Behaviors>
<Win8nl_Behavior:EventToCommandBehavior Event="ItemClick" Command="ItemClickCommand" CommandParameter="{Binding DataModel:SampleDataCommon.UniqueId}"/>
</WinRtBehaviors:Interaction.Behaviors>
но, как я уже догадался, это не сработало - в качестве параметра я получаю нулевое значение.
Я был бы благодарен за любую помощь, потому что, как я сказал в начале поста: я действительно не понимаю...
1 ответ
Вы не можете использовать EventToCommandBehavior
таким образом - об этом также заявил его автор в комментариях.
Я использую следующее прикрепленное свойство в таких случаях:
public static class ItemClickBehavior
{
public static DependencyProperty ItemClickCommandProperty = DependencyProperty.RegisterAttached("ItemClickCommand",
typeof(ICommand),
typeof(ItemClickBehavior),
new PropertyMetadata(null, OnItemClickCommandChanged));
public static void SetItemClickCommand(DependencyObject target, ICommand value)
{
target.SetValue(ItemClickCommandProperty, value);
}
public static ICommand GetItemClickCommand(DependencyObject target)
{
return (ICommand)target.GetValue(ItemClickCommandProperty);
}
private static void OnItemClickCommandChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
{
var element = target as ListViewBase;
if (element != null)
{
// If we're putting in a new command and there wasn't one already
// hook the event
if ((e.NewValue != null) && (e.OldValue == null))
{
element.ItemClick += OnItemClick;
}
// If we're clearing the command and it wasn't already null
// unhook the event
else if ((e.NewValue == null) && (e.OldValue != null))
{
element.ItemClick -= OnItemClick;
}
}
}
static void OnItemClick(object sender, ItemClickEventArgs e)
{
GetItemClickCommand(sender as ListViewBase).Execute(e.ClickedItem);
}
}
Вот как вы должны привязать команду к нему:
<GridView
x:Name="itemGridView"
AutomationProperties.AutomationId="ItemGridView"
AutomationProperties.Name="Grouped Items"
Grid.RowSpan="2"
Padding="116,137,40,46"
ItemsSource="{Binding Source={StaticResource groupedItemsViewSource}}"
ItemTemplate="{StaticResource Standard250x250ItemTemplate}"
SelectionMode="None"
IsSwipeEnabled="false"
IsItemClickEnabled="True"
itbmb:ItemClickBehavior.ItemClickCommand="{Binding ItemClickCommand}"
>
Я думаю, было бы не так сложно создать поведение из присоединенного свойства, если бы вы действительно этого хотели.