■解決したいこと
WPFでDataTemplateを使って画面遷移をしたいです。
下記のサイトを参考に作ったのですが、
エラーになります。
参考サイト:
【C#】【WPF】画面遷移する方法 その2
【C#】【WPF】画面遷移する方法 その2
■発生している問題・エラー
・エラーメッセージは2種類です。
①「名前 "xxxxx" は名前空間 "clr-namespace:Test" に存在しません。」
②「型 '〇〇〇〇〇' が見つかりませんでした。
アセンブリ参照が失われていないか、また、
すべての参照アセンブリがビルドされているかどうかを確認してください。」
参考サイト内では
「vm」と「view」が定義されていないようでしたので、
下記を自分で追記しました。
xmlns:view="clr-namespace:Test" xmlns:vm="clr-namespace:Test"
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/21 10:45 編集
回答1件
0
ベストアンサー
申し訳ないですけど、参考サイトはだいぶひどいですね。。。
わかっている人には何の知見も得られませんし、勉強中の方には省略部分が多すぎて参考になりません(今どきは完全版をGitHubに上げてリンクしたりするものですが)
ViewModels
・Views
フォルダ以下に、それぞれのViewModel
・View
があるという前提です。
そのフォルダ(正確には名前空間)を、xmlnsでvm
・view
と指定しています。
現状フォルダ分けされていないのと、それぞれのView
がありません(通常UserControl
です)
注)
MainWindow
もViews
の中に入れているのかもしれませんが、名前がややこしいのであえて入れていません。
MainWindowViewModel
もあると思われますが、質問の本題でないので作りません。
MainWindow
xml
1<Window 2 x:Class="Questions374820.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:view="clr-namespace:Questions374820.Views" 6 xmlns:vm="clr-namespace:Questions374820.ViewModels" 7 Title="MainWindow" 8 Width="800" 9 Height="450"> 10 <DockPanel> 11 <DockPanel.Resources> 12 <DataTemplate DataType="{x:Type vm:MainViewModel}"> 13 <view:MainView /> 14 </DataTemplate> 15 <DataTemplate DataType="{x:Type vm:Sub1ViewModel}"> 16 <view:Sub1View /> 17 </DataTemplate> 18 <DataTemplate DataType="{x:Type vm:Sub2ViewModel}"> 19 <view:Sub2View /> 20 </DataTemplate> 21 </DockPanel.Resources> 22 <UniformGrid DockPanel.Dock="Top" Rows="1"> 23 <Button Click="Button_Click" Content="メイン" /> 24 <Button Click="Button_Click" Content="サブ1" /> 25 <Button Click="Button_Click" Content="サブ2" /> 26 </UniformGrid> 27 <ContentControl Content="{Binding SampleViewModel}" Focusable="False" /> 28 </DockPanel> 29</Window>
cs
1using System.ComponentModel; 2using System.Windows; 3using System.Windows.Controls; 4using Questions374820.ViewModels; 5 6namespace Questions374820 7{ 8 public partial class MainWindow : Window, INotifyPropertyChanged 9 { 10 public ViewModelBase SampleViewModel { get; set; } = new MainViewModel(); 11 12 public MainWindow() 13 { 14 InitializeComponent(); 15 DataContext = this; 16 } 17 18 private void Button_Click(object sender, RoutedEventArgs e) 19 { 20 var 画面 = ((Button)sender).Content as string; 21 switch (画面) 22 { 23 case "メイン": 24 SampleViewModel = new MainViewModel(); 25 break; 26 case "サブ1": 27 SampleViewModel = new Sub1ViewModel(); 28 break; 29 case "サブ2": 30 SampleViewModel = new Sub2ViewModel(); 31 break; 32 } 33 34 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SampleViewModel))); 35 } 36 37 public event PropertyChangedEventHandler PropertyChanged; 38 } 39}
MainView
xml
1<UserControl 2 x:Class="Questions374820.Views.MainView" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 5 <Grid> 6 <TextBlock 7 HorizontalAlignment="Center" 8 VerticalAlignment="Center" 9 FontSize="36" 10 Text="MainView" /> 11 </Grid> 12</UserControl>
cs
1using System.Windows.Controls; 2 3namespace Questions374820.Views 4{ 5 public partial class MainView : UserControl 6 { 7 public MainView() => InitializeComponent(); 8 } 9}
cs
1namespace Questions374820.ViewModels 2{ 3 public class MainViewModel : ViewModelBase { } 4}
Sub1View
xml
1<UserControl 2 x:Class="Questions374820.Views.Sub1View" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 5 <Grid> 6 <TextBlock 7 HorizontalAlignment="Center" 8 VerticalAlignment="Center" 9 FontSize="36" 10 Text="Sub1View" /> 11 </Grid> 12</UserControl>
cs
1using System.Windows.Controls; 2 3namespace Questions374820.Views 4{ 5 public partial class Sub1View : UserControl 6 { 7 public Sub1View() => InitializeComponent(); 8 } 9}
cs
1namespace Questions374820.ViewModels 2{ 3 public class Sub1ViewModel : ViewModelBase { } 4}
Sub2View
xml
1<UserControl 2 x:Class="Questions374820.Views.Sub2View" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 5 <Grid> 6 <TextBlock 7 HorizontalAlignment="Center" 8 VerticalAlignment="Center" 9 FontSize="36" 10 Text="Sub2View" /> 11 </Grid> 12</UserControl>
cs
1using System.Windows.Controls; 2 3namespace Questions374820.Views 4{ 5 public partial class Sub2View : UserControl 6 { 7 public Sub2View() => InitializeComponent(); 8 } 9}
cs
1namespace Questions374820.ViewModels 2{ 3 public class Sub2ViewModel : ViewModelBase { } 4}
ViewModelBase
cs
1using System.ComponentModel; 2using System.Runtime.CompilerServices; 3 4namespace Questions374820.ViewModels 5{ 6 public class ViewModelBase : INotifyPropertyChanged 7 { 8 public event PropertyChangedEventHandler PropertyChanged; 9 protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null) 10 { 11 if (Equals(storage, value)) return false; 12 storage = value; 13 OnPropertyChanged(propertyName); 14 return true; 15 } 16 protected void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 17 } 18}
投稿2021/12/21 08:55
編集2023/07/29 13:00総合スコア9862
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。