質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

2回答

4800閲覧

ListBoxの選択を解除したい

yamaj

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1グッド

0クリップ

投稿2021/06/10 01:43

前提・実現したいこと

リストが選択される度に選択されたアイテムを追加する処理を作りたいと考えています。
(ListBoxItemをボタン代わりにしたい)

発生している問題

リストに表示されている項目のSelectedIndexが変化した場合にその項目を追加していけば良いかと思ったのですが、同じ項目の場合追加できない為、選択された際に選択を解除すれば良いかと考えました。

しかし、SelectedIndexをバインドして-1を入れても選択が解除されません。

ListBoxの選択を解除する方法があれば教えて頂きたく思います。

リストの項目をボタンのように扱う別の方法でも構いません。

該当のソースコード

xaml

1<Window x:Class="BlankCoreApp1.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:prism="http://prismlibrary.com/" 5 prism:ViewModelLocator.AutoWireViewModel="True" 6 Height="350" Width="525" > 7 <Grid> 8 <ListBox SelectedIndex="{Binding index.Value,Mode=TwoWay}"> 9 <ListBoxItem Content="あああ"/> 10 <ListBoxItem Content="いいい"/> 11 <ListBoxItem Content="ううう"/> 12 <ListBoxItem Content="えええ"/> 13 <ListBoxItem Content="おおお"/> 14 </ListBox> 15 </Grid> 16</Window>

C#

1using System; 2using Prism.Mvvm; 3using Reactive.Bindings; 4 5namespace BlankCoreApp1 6{ 7 public class MainWindowViewModel : BindableBase 8 { 9 public ReactivePropertySlim<int> index { get; } 10 11 public MainWindowViewModel() 12 { 13 index = new ReactivePropertySlim<int>(); 14 index.Subscribe(x => OnIndexChange(x)); 15 } 16 17 private void OnIndexChange(int x) 18 { 19 index.Value = -1; 20 } 21 } 22}

補足情報(FW/ツールのバージョンなど)

VisualStudio 2019 (V16.10.0)
Prism V8

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamaj

2021/06/10 07:49

ご回答ありがとうございます。 SelectionChangedでUnselectAll()を呼び出したら目的の動作になりました。 …が、コードビハインド側だと「SelectedIndex = -1」でも動くみたいです。 VM側だけでできればいいんですが、無理だと思ったらコードビハインド側に書くことにします。 (VM側に通知するルートを作るのを面倒がってるだけですが)
guest

回答2

0

ベストアンサー

しかし、SelectedIndexをバインドして-1を入れても選択が解除されません。

SelectedIndexが変わっている最中に、さらに変えてもダメってことじゃないでしょうか(どこかにドキュメントがありそうですが探していません^^;

-1を入れるのを少し遅らせると反映されます(なんか気持ちが悪いですが^^;

リストの項目をボタンのように扱う別の方法でも構いません。

選択に意味はなく単にボタンを並べるという使い方なら、ItemsControlでいいと思います。
ItemsControl 攻略 ~ 外観のカスタマイズ | grabacr.nét

xml

1<Window 2 x:Class="Questions343230.Views.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:prism="http://prismlibrary.com/" 6 Width="525" 7 Height="350" 8 prism:ViewModelLocator.AutoWireViewModel="True"> 9 <Grid> 10 <Grid.ColumnDefinitions> 11 <ColumnDefinition /> 12 <ColumnDefinition /> 13 </Grid.ColumnDefinitions> 14 15 <GroupBox Header="ListBox"> 16 <ListBox ItemsSource="{Binding Items}" SelectedIndex="{Binding Index.Value}" /> 17 </GroupBox> 18 19 <GroupBox Grid.Column="1" Header="ItemsControl"> 20 <ItemsControl ItemsSource="{Binding Items}"> 21 <ItemsControl.ItemTemplate> 22 <DataTemplate> 23 <Button 24 Command="{Binding DataContext.Command, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}" 25 CommandParameter="{Binding}" 26 Content="{Binding}" /> 27 </DataTemplate> 28 </ItemsControl.ItemTemplate> 29 </ItemsControl> 30 </GroupBox> 31 </Grid> 32</Window>

cs

1using Prism.Mvvm; 2using Reactive.Bindings; 3using System; 4using System.Collections.Generic; 5using System.Diagnostics; 6using System.Reactive.Linq; 7using System.Threading.Tasks; 8 9namespace Questions343230.ViewModels 10{ 11 public class MainWindowViewModel : BindableBase 12 { 13 public List<string> Items { get; } = new List<string> { "あああ", "いいい", "ううう", "えええ", "おおお", }; 14 public ReactivePropertySlim<int> Index { get; } = new ReactivePropertySlim<int>(); 15 public ReactiveCommand<string> Command { get; } = new ReactiveCommand<string>(); 16 17 public MainWindowViewModel() 18 { 19 Index.Subscribe(OnIndexChange); 20 Command.Subscribe(x => Debug.WriteLine(x)); 21 } 22 23 // fire & forget 24 private async void OnIndexChange(int x) 25 { 26 if (x == -1) return; 27 Debug.WriteLine(x); 28 29 // わかりやすいように1秒待つ 30 await Task.Delay(1000); 31 32 // 選択時のハイライトがちょうどクリック感があっていい感じw 33 //await Task.Delay(100); 34 35 // おそらくこれでもいい気がするが、根拠はない 36 //await Task.Delay(1); 37 38 Index.Value = -1; 39 } 40 } 41}

投稿2021/06/10 08:55

編集2023/07/27 15:16
TN8001

総合スコア9304

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamaj

2021/06/14 00:17

毎度ありがとうございます。 イチから勉強している訳ではなく、欲しいものだけを検索してつまみ食いしている感じなので、知らないことが沢山あるなと感じました。 (「Index.Subscribe(OnIndexChange);」と書けるとは…。) 今回はボタンの方を使わせて頂きます。 ありがとうございました。
yamaj

2021/06/15 00:01

ボタンで行けると思ったら、スワイプでスクロール出来ませんでした…。 TouchUp及びMouseUpにて対応する事で解決できました。
guest

0

クリックイベントで追加するようにしては

投稿2021/06/10 01:46

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamaj

2021/06/10 02:04

クリックイベントはリスト外は反応しますが、リストをクリックしても飛んでこないようです。 何かプロパティで設定あるのでしょうか…。 <ListBox> <i:Interaction.Triggers> <i:EventTrigger EventName="MouseDown"> <i:InvokeCommandAction Command="{Binding ClickCommand, Mode=OneWay}"/> </i:EventTrigger> </i:Interaction.Triggers> <ListBoxItem Content="あああ"/> <ListBoxItem Content="いいい"/> <ListBoxItem Content="ううう"/> <ListBoxItem Content="えええ"/> <ListBoxItem Content="おおお"/> </ListBox>
y_waiwai

2021/06/10 02:14

OnMouseRightButtonDownってのはあるみたいですね # OnMouseDoubleClickのほうがいいのかも
yamaj

2021/06/10 02:39

MouseRightButtonDownも一緒で、リスト外しか反応しないですね。
yamaj

2021/06/10 02:54

TouchDownイベントは取れましたが、どのアイテムが選択されたかを取得するのができないですね。 こちらは、多分TouchUp後に擬似MouseUpが発生して、そちらで選択が処理されるからではないかと推察します。
y_waiwai

2021/06/10 08:57

マウスの位置からどの項目をクリックしたのかを算出してはどうでしょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問