mvvm light toolkitの導入③
今回は別のウィンドウを作成して、
メイン画面から呼び出して表示してみる。
Viewフォルダに、SubView.xamlを
ViewModelフォルダに、SubViewModel.csを追加する。
これらのViewとViewModelの紐付けをするために、
まずはViewModelLocatorにSubViewModelの情報を追加する。
static ViewModelLocator() { ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); if (ViewModelBase.IsInDesignModeStatic) { SimpleIoc.Default.Register<IDataService, Design.DesignDataService>(); } else { SimpleIoc.Default.Register<IDataService, DataService>(); } SimpleIoc.Default.Register<MainViewModel>(); SimpleIoc.Default.Register<SubViewModel>(); }
public SubViewModel Sub { get { return ServiceLocator.Current.GetInstance<SubViewModel>(); } }
次に、SubView.xamlのDataContext属性を修正する。
DataContext="{Binding Sub, Source={StaticResource Locator}}"
SubViewModelに画面表示用にプロパティを用意する。
public class SubViewModel : ViewModelBase { private string _subText; public string SubText { get { return _subText; } set { _subText = value; RaisePropertyChanged("SubText"); } } /// <summary> /// Initializes a new instance of the SubWindowViewModel class. /// </summary> public SubViewModel() { SubText = "これはSubです"; } } }
SubViewに、ViewModelで設定したテキストを表示するようなコントロールを用意してバインドする。
<Grid> <TextBlock Text="{Binding SubText}" HorizontalAlignment="Center" VerticalAlignment="Center"/> </Grid>
これで紐付けができたので、
App.xamlのStartupUriをSubView.xamlに変更すれば表示できる。
では、別の画面からこのSub画面を表示するにはどうしたらいいか。
まずはApp.xamlのStartupUriをMainWindow.xamlに戻す。
次に、MainViewModelにSub画面表示用のコマンドを用意する。
private RelayCommand _buttonClickCommand; public RelayCommand ButtonClickCommand { get { return _buttonClickCommand ?? (_buttonClickCommand = new RelayCommand(OnButtonClick)); } } public void OnButtonClick() { SubView v = new SubView(); v.ShowDialog(); }
今回はViewModel側でSub画面のViewを生成してそれをShowする方法をとった。
他の方法もあるみたいだけど、今日はこれでいく。
最後に、MianWindow.xamlにボタンを用意して、コマンドを設定する。
<Button Content="Subを表示する" Command="{Binding ButtonClickCommand}" />