前提・実現したいこと
こんにちは!
Windows10でVisual Studio2017Communityで、WPFのシステムを作っています。
MVVMにしてみようと思い、次のように処理しました。
発生している問題・エラーメッセージ
Modelを使っていない…。
ModelのMemberIdとMemberNameを使うには、どうすればいいでしょう?
該当のソースコード
XAML
1<Window x:Class="BindingTenkey.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:BindingTenkey" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="500" Width="800"> 9 <Grid> 10 <Grid.RowDefinitions> 11 <RowDefinition Height="100*"/> 12 <RowDefinition Height="100*"/> 13 <RowDefinition Height="100*"/> 14 <RowDefinition Height="100*"/> 15 <RowDefinition Height="100*"/> 16 <RowDefinition Height="100*"/> 17 </Grid.RowDefinitions> 18 <Grid.ColumnDefinitions> 19 <ColumnDefinition Width="80*"/> 20 <ColumnDefinition Width="80*"/> 21 <ColumnDefinition Width="80*"/> 22 </Grid.ColumnDefinitions> 23 <Button Grid.Row="0" Grid.Column="0" Click="OnNumberCilck">7</Button> 24 <Button Grid.Row="0" Grid.Column="1" Click="OnNumberCilck">8</Button> 25 <Button Grid.Row="0" Grid.Column="2" Click="OnNumberCilck">9</Button> 26 <Button Grid.Row="1" Grid.Column="0" Click="OnNumberCilck">4</Button> 27 <Button Grid.Row="1" Grid.Column="1" Click="OnNumberCilck">5</Button> 28 <Button Grid.Row="1" Grid.Column="2" Click="OnNumberCilck">6</Button> 29 <Button Grid.Row="2" Grid.Column="0" Click="OnNumberCilck">1</Button> 30 <Button Grid.Row="2" Grid.Column="1" Click="OnNumberCilck">2</Button> 31 <Button Grid.Row="2" Grid.Column="2" Click="OnNumberCilck">3</Button> 32 <Button Grid.Row="3" Grid.Column="0" Click="OnNumberCilck">0</Button> 33 <Button Grid.Row="3" Grid.Column="1" Click="OnClearClick">Clear</Button> 34 <Button Grid.Row="3" Grid.Column="2" Click="OnEnterClick">Enter</Button> 35 <Label Grid.Row="4" Grid.Column="0" Content="ID" /> 36 <TextBox Text="{Binding Path=MemberId, Mode=OneWay}" Grid.Row="4" Grid.Column="1" Grid.ColumnSpan="2" /> 37 <Label Grid.Row="5" Grid.Column="0" Content="Name" /> 38 <TextBox Text="{Binding Path=MemberName, Mode=OneWay}" Grid.Row="5" Grid.Column="1" Grid.ColumnSpan="2" /> 39 </Grid> 40</Window>
C#
1using System.Collections.Generic; 2using System.Windows; 3using System.Windows.Controls; 4 5namespace BindingTenkey 6{ 7 public partial class MainWindow : Window 8 { 9 MemberViewModel MemberViewModel; 10 public List<MemberModel> Members = new List<MemberModel>(); 11 12 public MainWindow() 13 { 14 InitializeComponent(); 15 16 MemberViewModel = new MemberViewModel(this); 17 18 DataContext = this.MemberViewModel; 19 20 var member = new MemberModel() 21 { 22 MemberId = "2000", 23 MemberName ="クウガ" 24 }; 25 Members.Add(member); 26 var member5 = new MemberModel() 27 { 28 MemberId = "555", 29 MemberName = "555" 30 }; 31 Members.Add(member5); 32 } 33 34 private void OnNumberCilck(object sender, System.Windows.RoutedEventArgs e) 35 { 36 var button = (Button)sender; 37 this.MemberViewModel.NumberCommand(button.Content); 38 } 39 40 private void OnEnterClick(object sender, System.Windows.RoutedEventArgs e) 41 { 42 this.MemberViewModel.EnterCommand(); 43 } 44 45 private void OnClearClick(object sender, System.Windows.RoutedEventArgs e) 46 { 47 this.MemberViewModel.ClearCommand(); 48 } 49 } 50}
C#
1namespace BindingTenkey 2{ 3 public class MemberModel 4 { 5 public string MemberId { get; set; } 6 7 public string MemberName { get; set; } 8 } 9}
C#
1using System.ComponentModel; 2using System.Linq; 3 4namespace BindingTenkey 5{ 6 public class MemberViewModel : INotifyPropertyChanged 7 { 8 private MainWindow MainWindow; 9 10 public MemberViewModel(MainWindow mainWindow) 11 { 12 this.MainWindow = mainWindow; 13 } 14 15 public string MemberId { get; set; } 16 public string MemberName { get; set; } 17 18 internal void NumberCommand(object content) 19 { 20 MemberId += (string)content; 21 OnPropertyChanged(nameof(MemberId)); 22 } 23 24 internal void EnterCommand() 25 { 26 var result = MainWindow.Members 27 .Where(m => m.MemberId == MemberId).FirstOrDefault(); 28 if (result == null) 29 { 30 ClearCommand(); 31 return; 32 } 33 MemberName = result.MemberName; 34 OnPropertyChanged(nameof(MemberName)); 35 } 36 37 internal void ClearCommand() 38 { 39 MemberId = string.Empty; 40 OnPropertyChanged(nameof(MemberId)); 41 MemberName = string.Empty; 42 OnPropertyChanged(nameof(MemberName)); 43 } 44 45 public event PropertyChangedEventHandler PropertyChanged; 46 protected void OnPropertyChanged(string name) 47 { 48 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); 49 } 50 } 51}
試したこと
MVVMほとんど初めて。なんとかコードを書いてみた。
動作はしました。
疑問点
1.ModelのMemberIdとMemberNameを使うには、どうすればいいでしょう?
2.Mainで作ったリストを渡すのに、コンストラクタで
MemberViewModel = new MemberViewModel(this);
としているのは、もっとよい方法はありますか?
よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
Windows10 Home
Visual Studio 2017 Community
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/21 01:14
2018/12/21 01:28
2018/12/21 13:18
2018/12/21 13:18
2018/12/21 13:25 編集
2018/12/25 02:45
2018/12/26 15:30