2
私は小さなプログラムで作業していて、MVTの手法を使ってDataTemplateを使用してVMのビューを作成しようとしています。問題は、ビューのインスタンスを作成する代わりに、代わりにVMのToString()結果を表示しているようです。 Viewクラス(MainNavigation.xaml)のコンストラクタにブレークポイントを置くと、決して到達しません。WPF DataTemplateはToStringを表示します
下記のコードを参考にしてください。
MainWindow.xaml
<Window x:Class="Tester.Wpf.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Tester.Wpf"
xmlns:scr="clr-namespace:Tester.Wpf.Screens"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<DataTemplate DataType="x:Type scr:MainNavigationViewModel">
<scr:MainNavigation />
</DataTemplate>
</Window.Resources>
<Grid>
<ContentControl Name="MainNav" Content="{Binding MainNavigationViewModel2}" />
</Grid>
</Window>
MainWindow.xaml.cs
using System.ComponentModel;
using System.Windows;
using Tester.Wpf.Screens;
namespace Tester.Wpf
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{
private MainNavigationViewModel _mainNavigationViewModel;
public MainWindow()
{
this.DataContext = this;
this.MainNavigationViewModel2 = new MainNavigationViewModel();
InitializeComponent();
}
public MainNavigationViewModel MainNavigationViewModel2
{
get { return _mainNavigationViewModel; }
set { _mainNavigationViewModel = value;
RaisePropertyChangedEvent("MainNavigationViewModel2");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChangedEvent(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
MainNavigation.xaml.cs
using System.Windows.Controls;
namespace Tester.Wpf.Screens
{
/// <summary>
/// Interaction logic for MainNavigation.xaml
/// </summary>
public partial class MainNavigation : UserControl
{
public MainNavigation()
{
InitializeComponent();
}
}
}
MainNavigationViewModel.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tester.Wpf.Helpers;
namespace Tester.Wpf.Screens
{
public class MainNavigationViewModel : BaseViewModel
{
public int Test = 10;
}
}
MainNavigation.xaml
<UserControl x:Class="Tester.Wpf.Screens.MainNavigation"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Tester.Wpf.Screens"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid Background="Blue">
<TextBlock>YOU"VE MADE IT!</TextBlock>
</Grid>
</UserControl>
'MainNavigationViewModel2'は何ですか?そのようなプロパティはなく、 'DataContext'をどこにも設定していません。アウトプットウィンドウでバインディングエラーがないかチェックしてください。 MVVMチュートリアルを見つけてそれに従うことをお勧めします(例:[this one](https://www.tutorialspoint.com/mvvm/index.htm))。 – Sinatr
申し訳ありませんが、コードが追加されました。チュートリアルをチェックします。ありがとうございます。多くのものをチェックした(トンと思われる)が、何らかの理由でこの作業をすることはできないし、おそらく何かばかげて小さい。 –
プロパティを最初に設定してからDataContextを設定した場合、通知を呼び出す必要はありません。バグの一つは 'InitializeComponents'の前にやっていることです。 – Sinatr