在Xaml中绑定一个分组的集合

时间:2012-11-12 16:25:02

标签: xaml collections windows-runtime eventtocommand

我搜索了一下,但我发现的信息并不是我需要的。所以我决定问你们所有人 - 我确定这是一个新手问题,但我真的不明白。 开始吧: 我有一个DataSource,它是一个分组的可观察集合。目前我有两组不同的项目。这两个组和项目属于同一个共同基础:

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与Command绑定到我的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,所以我无法将它连接到Model的属性。看着Page.DataContext我告诉XAML tu使用我的ViewModel作为DataContext。我想这是对的。但是如何访问Model-properties呢? 我试图这样做(将我的模型定义为DataModel):

<WinRtBehaviors:Interaction.Behaviors>
            <Win8nl_Behavior:EventToCommandBehavior Event="ItemClick" Command="ItemClickCommand" CommandParameter="{Binding DataModel:SampleDataCommon.UniqueId}"/>
        </WinRtBehaviors:Interaction.Behaviors>

但正如我之前猜测的那样它不起作用 - 因为参数我得到了null。

我会感谢任何帮助,因为正如我在帖子开头说的那样:我真的不明白......

1 个答案:

答案 0 :(得分:0)

您不能以这种方式使用EventToCommandBehavior - 其作者也在comments中说明了这一点。

在这种情况下,我使用以下附加属性:

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}"
    >

我想如果您真的想要从附加属性创建行为并不是那么困难。