1

少し検索しましたが、見つけた情報が必要なものではありません。だから私はあなた方全員に尋ねることにしました-それは初心者の質問だと確信していますが、私は本当にそれを理解していません。始めましょう:グループ化された監視可能なコレクションであるデータソースがあります。現在、アイテム数が異なる2つのグループがあります。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>

しかし今問題。「BindingUniqueId」では、DataContextが私のViewModelであると言っているので、モデルのプロパティに接続できません。Page.DataContextを見て、XAMLtuにViewModelをDataContextとして使用するように指示しました。これは正しかったと思います。しかし、どうすればModel-propertiesにアクセスできますか?私はこのようにしようとしました(私のモデルをDataModelとして定義しました):

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

しかし、前もって推測したように、それは機能しませんでした-パラメータとして私はnullを取得します。

投稿の冒頭で言ったように、私は助けてくれてありがたいです:私は本当にそれを理解していません...

4

1 に答える 1

0

このように使用することはできません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}"
    >

本当にやりたいのであれば、添付プロパティから動作を作成するのはそれほど難しくないと思います。

于 2012-11-13T06:05:55.817 に答える