2017-10-25 8 views
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> 
+0

'MainNavigationViewModel2'は何ですか?そのようなプロパティはなく、 'DataContext'をどこにも設定していません。アウトプットウィンドウでバインディングエラーがないかチェックしてください。 MVVMチュートリアルを見つけてそれに従うことをお勧めします(例:[this one](https://www.tutorialspoint.com/mvvm/index.htm))。 – Sinatr

+0

申し訳ありませんが、コードが追加されました。チュートリアルをチェックします。ありがとうございます。多くのものをチェックした(トンと思われる)が、何らかの理由でこの作業をすることはできないし、おそらく何かばかげて小さい。 –

+0

プロパティを最初に設定してからDataContextを設定した場合、通知を呼び出す必要はありません。バグの一つは 'InitializeComponents'の前にやっていることです。 – Sinatr

答えて

3

MainWindow.xamlファイルでSinatrさんのコメントに基づいて、次の行を変更:

<DataTemplate DataType="{x:Type scr:MainNavigationViewModel}"> 

<DataTemplate DataType="x:Type scr:MainNavigationViewModel"> 

関連する問題