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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

WPF

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

Q&A

解決済

2回答

3620閲覧

WPF ボタンを判断するビヘイビアに関して

kawauso

総合スコア56

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

WPF

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

0グッド

0クリップ

投稿2017/08/10 01:08

お世話になっております。
現在、ListBox内のアイテムをUp, Downボタン操作で並べ替える実装を行っております。
How to move item in listBox up and down?(StackOverflow)を参考にViewのコードビハインドに記述する方式では実装できました。

行いたいこと
View側に書くのではなく、ビヘイビアとして実装したいと思っております。
ビヘイビアという手法を最近知り、実装経験はありません。

ビヘイビアに関して調べたのですが、
Behavior<Button>などを継承しているものと、していないもの。
Interactivityを参照追加しているものや、していないもの。
「アクション」、「添付ビヘイビア」、「コマンド」、「Blend」、などの単語がでてきて、よくわからない状況です。

質問
下記の実装(現状コード)をビヘイビア化するのにはどうすればよいでしょうか。
すべてのボタンに対して同じ操作をするのであれば、Web上の記事を参考にして実装はできそうではありますが、
Move upボタンが押されたときはMoveItem(-1, lbTask);、Move downボタンが押されたときはMoveItem(1, lbTask);のようにボタンで判断して、適切な処理を行う場合のやり方が分かりません。
よろしくお願いいします。

環境
C#, WPF, .NET 4.6.2, VS2017Pro, Win10

現状コード How to move item in listBox up and down?(StackOverflow)からほぼコピペです
コードビハインド

c#

1 private void UpButton_Click(object sender, RoutedEventArgs e) 2 { 3 MoveItem(-1, lbTask); 4 } 5 6 private void DownButton_Click(object sender, RoutedEventArgs e) 7 { 8 MoveItem(1, lbTask); 9 } 10 11 public void MoveItem(int direction, ListBox lb) 12 { 13 // Checking selected item 14 if (lb.SelectedItem == null || lb.SelectedIndex < 0) 15 return; // No selected item - nothing to do 16 17 // Calculate new index using move direction 18 int newIndex = lb.SelectedIndex + direction; 19 20 // Checking bounds of the range 21 if (newIndex < 0 || newIndex >= lb.Items.Count) 22 return; // Index out of range - nothing to do 23 24 object selected = lb.SelectedItem; 25 26 // Removing removable element 27 lb.Items.Remove(selected); 28 // Insert it in new position 29 lb.Items.Insert(newIndex, selected); 30 // Restore selection 31 lb.SelectedIndex = newIndex; 32 }

XAML

1<Button Content="Move up" Margin="5,20,5,5" Click="UpButton_Click"/> 2<Button Content="Move down" Margin="5" Click="DownButton_Click"/> 3<ListBox Grid.Row="0" Grid.Column="1" x:Name="lbTask"> 4 <ListBoxItem Content="Item1"/> 5 <ListBoxItem Content="Item2"/> 6 <ListBoxItem Content="Item3"/> 7 <ListBoxItem Content="Item4"/> 8 <ListBoxItem Content="Item5"/> 9</ListBox>

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

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

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

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

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

guest

回答2

0

Behavior を使うのは、目的ではなく手段です。
単体で使う意味はありませんし、コードビヘイビアに置き換わるものではありません。
プレゼンテーションとドメインを分離する為にMVVMモデルを採用した場合に便利な機能です。

投稿2017/08/10 03:29

hihijiji

総合スコア4150

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

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

0

ベストアンサー

標準的な環境でBehaviorを記述すると以下のようになります。パラメータをプロパティで指定することで挙動を変更します。

CSharp

1 /// <summary> 2 /// ListBox項目上下させるボタンのビヘイビア 3 /// </summary> 4 public class SampleBehaviour 5 { 6 public static int GetDirection(DependencyObject d) => (int)d.GetValue(DirectionProperty); 7 public static void SetDirection(DependencyObject d, int value) => d.SetValue(DirectionProperty, value); 8 public static readonly DependencyProperty DirectionProperty = DependencyProperty.RegisterAttached("Direction", typeof(int), typeof(SampleBehaviour), new PropertyMetadata(1)); 9 10 public static ListBox GetListBox(DependencyObject d) => (ListBox)d.GetValue(ListBoxProperty); 11 public static void SetListBox(DependencyObject d, int value) => d.SetValue(ListBoxProperty, value); 12 public static readonly DependencyProperty ListBoxProperty = DependencyProperty.RegisterAttached("ListBox", typeof(ListBox), typeof(SampleBehaviour), new PropertyMetadata(null, ListBoxChanged)); 13 14 private static void ListBoxChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 15 { 16 var button = d as Button; 17 if (button == null) return; 18 19 button.Click -= ButtonClick; 20 21 var lb = (ListBox)e.NewValue; 22 if (lb != null) 23 { 24 button.Click += ButtonClick; 25 } 26 } 27 28 private static void ButtonClick(object sender, RoutedEventArgs e) 29 { 30 var button = sender as Button; 31 if (button == null) return; 32 33 var direction = GetDirection(button); 34 var lb = GetListBox(button); 35 36 MoveItem(direction, lb); 37 } 38 39 public static void MoveItem(int direction, ListBox lb) 40 { 41 // Checking selected item 42 if (lb.SelectedItem == null || lb.SelectedIndex < 0) 43 return; // No selected item - nothing to do 44 45 // Calculate new index using move direction 46 int newIndex = lb.SelectedIndex + direction; 47 48 // Checking bounds of the range 49 if (newIndex < 0 || newIndex >= lb.Items.Count) 50 return; // Index out of range - nothing to do 51 52 object selected = lb.SelectedItem; 53 54 // Removing removable element 55 lb.Items.Remove(selected); 56 // Insert it in new position 57 lb.Items.Insert(newIndex, selected); 58 // Restore selection 59 lb.SelectedIndex = newIndex; 60 } 61 }

XAML

1 <StackPanel> 2 <Button Content="Move up" local:SampleBehaviour.ListBox="{Binding ElementName=lbTask}" local:SampleBehaviour.Direction="-1" /> 3 <Button Content="Move down" local:SampleBehaviour.ListBox="{Binding ElementName=lbTask}" local:SampleBehaviour.Direction="+1" /> 4 <ListBox x:Name="lbTask"> 5 <ListBoxItem Content="Item1"/> 6 <ListBoxItem Content="Item2"/> 7 <ListBoxItem Content="Item3"/> 8 <ListBoxItem Content="Item4"/> 9 <ListBoxItem Content="Item5"/> 10 </ListBox> 11 </StackPanel>

Behavior<T> を継承して使用するほうが一般的かと思いますが、これは標準環境には含まれておらず、別途 Blend for Visual Studio SDK for .NETをインストールしなければ使用できません。

投稿2017/08/10 12:56

neelabo

総合スコア60

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

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

kawauso

2017/08/11 04:40

回答ありがとうございました。 BlendSDKをインストールし、提示してくださったコードを参考にしながらBehavior<T>を継承する方法で実装してみました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問