Quantcast
Channel: かずきのBlog@hatena
Viewing all articles
Browse latest Browse all 1387

UWPのListView/GridViewでSelectedItemsをViewModelに渡したい

$
0
0

SelectedItemsってDependencyPropertyじゃないっぽいのでバインド出来ないんですよね。ということで、ベタな方法ですがView → ViewModelの1方向でいいなら以下のような方法が使えます。

まず、ViewModelとListViewに表示するアイテムのクラスを作ります。

using System;
using System.Collections.Generic;
using System.Linq;
using Windows.UI.Popups;

namespace App66
{
    publicclass MainPageViewModel
    {
        public IEnumerable<Person> SelectedItems { get; set; } = Enumerable.Empty<Person>();

        public async void Dump()
        {
            var message = $"{string.Join(", ", this.SelectedItems.Select(x => x.Name).ToArray())} selected.";
            var dlg = new MessageDialog(message);
            await dlg.ShowAsync();
        }
    }

    publicclass Person
    {
        publicstring Name { get; set; }

        publicoverridestring ToString()
        {
            returnthis.Name;
        }
    }
}

ViewModelのSelectedItemsに選択された項目を突っ込むようにします。 やり方は、ListViewのSelectionChangedで突っ込むだけ。

<Pagex:Class="App66.MainPage"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="using:App66"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:System="using:System"mc:Ignorable="d"><Page.DataContext><local:MainPageViewModel /></Page.DataContext><Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"><Grid.RowDefinitions><RowDefinition Height="Auto" /><RowDefinition /></Grid.RowDefinitions><Button Content="Dump"HorizontalAlignment="Stretch"Click="{x:Bind ViewModel.Dump}" /><ListView x:Name="ListView"Grid.Row="1"SelectionMode="Multiple"SelectionChanged="ListView_SelectionChanged"><local:Person Name="Tanaka" /><local:Person Name="Kimura" /><local:Person Name="Ohta" /><local:Person Name="Homuhomu" /></ListView></Grid></Page>
using System.Linq;
using Windows.UI.Xaml.Controls;

// 空白ページのアイテム テンプレートについては、http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409 を参照してくださいnamespace App66
{
    /// <summary>/// それ自体で使用できる空白ページまたはフレーム内に移動できる空白ページ。/// </summary>publicsealedpartialclass MainPage : Page
    {
        public MainPageViewModel ViewModel => this.DataContext as MainPageViewModel;

        public MainPage()
        {
            this.InitializeComponent();
        }

        privatevoid ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            this.ViewModel.SelectedItems = this.ListView.SelectedItems.Cast<Person>();
        }
    }
}

多用するならビヘイビア化してもいいかもですね。


Viewing all articles
Browse latest Browse all 1387

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>