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

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

新規登録して質問してみよう
ただいま回答率
85.35%
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

解決済

1回答

3474閲覧

あ【WPF(xaml)】DataTemplateを使って画面遷移をしたい

k_mail

総合スコア90

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/12/20 23:57

編集2021/12/22 10:32

■解決したいこと
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"

お手数ですが、
どのように修正れすれば、
DataTemplateを使って画面遷移ができますでしょうか。
イメージ説明

ベストアンサーをコピペした時の画像
イメージ説明

TN8001👍を押しています

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

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

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

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

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

TN8001

2021/12/21 08:55

[[Q&A] 【WPF(xaml)】DataTemplateを使って画面遷移をしたい - Qiita](https://qiita.com/Kakeishi_Misa/questions/cbdd7e6422f76903ad30 > teratailでは、マルチポスト※の推奨はしていません。 [ヘルプ|teratail(テラテイル)](https://teratail.com/help#posted-otherservice どちらかを削除しろというわけではなく、 * 質問にリンクを記載する * どちらかで進捗や解決があれば、できるだけ速やかに他サイトに反映する ということです。
k_mail

2021/12/21 10:45 編集

承知しました。 すいません。知らなったです。 もう一方で質問していた分を削除しました。
guest

回答1

0

ベストアンサー

申し訳ないですけど、参考サイトはだいぶひどいですね。。。
わかっている人には何の知見も得られませんし、勉強中の方には省略部分が多すぎて参考になりません(今どきは完全版をGitHubに上げてリンクしたりするものですが)

記事の意図のプロジェクト構成はこうです。
ソリューションエクスプローラー

ViewModelsViewsフォルダ以下に、それぞれのViewModelViewがあるという前提です。
そのフォルダ(正確には名前空間)を、xmlnsでvmviewと指定しています。

現状フォルダ分けされていないのと、それぞれのViewがありません(通常UserControlです)

注)
MainWindowViewsの中に入れているのかもしれませんが、名前がややこしいのであえて入れていません。
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
TN8001

総合スコア9862

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

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

k_mail

2021/12/21 10:44

ご丁寧にありがとうございます。 また、後で確認します。
k_mail

2021/12/22 10:29

私の環境でも再現できました。 非常に助かりました。 ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問