2016-04-18 17 views
0

モデルビュービューモデルを実装しようとしています。しかし、私はそれを働かせることはできません。MVVMでの問題、バインドが表示されない

これは私のモデルと基底クラスです:

namespace GridCity.GUI { 
    class DateInfoModel : PropertyChangedBase { 
     private string _Date = string.Empty; 

     public string Date { 
      get { 
       return _Date; 
      } 
      set { 
       if (_Date != value) { 
        _Date = value; 
        OnPropertyChanged(nameof(Date)); 
        System.Console.WriteLine(_Date); 
       } 
      } 
     } 
    } 
} 

namespace GridCity.GUI { 
    using System.ComponentModel; 
    public abstract class PropertyChangedBase : INotifyPropertyChanged { 
     public event PropertyChangedEventHandler PropertyChanged; 

     protected internal void OnPropertyChanged(string propertyName) { 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
      System.Console.WriteLine("OnPropertyChanged: " + propertyName); 
     } 
    } 
} 

は、これは私のviewmodelです:

namespace GridCity.GUI { 
    class DateInfoViewModel : PropertyChangedBase { 
     public DateInfoViewModel(DateInfoModel model) { 
      Model = model; 
     } 
     public DateInfoModel Model { get; private set; } 
    } 
} 

そして、これが私の見解です:

<UserControl x:Class="GridCity.GUI.DateInfoView" 
      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:GridCity.GUI" 
      mc:Ignorable="d" 
      d:DesignHeight="60" d:DesignWidth="150"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="150"></ColumnDefinition> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="30"></RowDefinition> 
      <RowDefinition Height="30"></RowDefinition> 
     </Grid.RowDefinitions> 
     <Label Grid.Row="0" Grid.Column="0" FontWeight="ExtraBold" Content="{Binding Model.Date}"></Label> 
     <Label Grid.Row="1" Grid.Column="0" FontWeight="ExtraBold" Content="TEST"></Label> 
    </Grid> 
</UserControl> 

私は私の中でview.DataContextを設定MainWindowコンストラクタ:

public MainWindow() { 
    InitializeComponent(); 

    DateInfoView view = new DateInfoView(); 
    Game.DateInfoModel = new DateInfoModel(); 
    DateInfoViewModel viewModel = new DateInfoViewModel(Game.DateInfoModel); 

    view.DataContext = viewModel; 
} 

私は2番目のラベル(TEST)を見ることができるので、ユーザーコントロールは理論上で動作するようです。しかし、私は最初のラベルに何も表示されません。しかし、_Dateが変更され、OnPropertyChangedが呼び出されたときにコンソール上の出力を見ることができます。

私には何が欠けていますか?

this.DataContext = viewModel; 

+0

どのように 'DataContext'を' DateInfoViewModel'のインスタンスに設定しますか? – dkozl

+0

@ dkozl:申し訳ありませんが、その部分を忘れました。私は私の質問を編集しました。 – gartenriese

+1

これは1つの質問に答えるが、別の質問を作成する。あなたは 'view'で何をしていますか?あなたはそれを作成し、 'DataContext'を設定しますが、それ以降は使用しません。表示されるインスタンスは、 'DataContext'を設定したインスタンスと同じインスタンスですか? – dkozl

答えて

1

に配置されている場合メインウィンドウのDataContextのを設定する必要がありますよう。 1つはXAMLで定義し、もう1つはコードで作成するものです。後者のDataContextを設定しますが、使用しないでください。あなたは、あなたが別のコンテキストをしたいと言うと、あなたのUserControl

public MainWindow() 
{ 
    InitializeComponent(); 

    Game.DateInfoModel = new DateInfoModel(); 
    this.DataContext = new DateInfoViewModel(Game.DateInfoModel); 
} 

DataContext値を下に渡しますが、全体Window

ソリューション1

設定DataContextいくつかのいずれかの方法でそれを修正することができます異なるコントロールについて

解決策2

、私はしかし、そのようなより小さなビューモデルと、あなたは大きなビューモデルを作成第三ソリューションを示唆しているXAML

<xx:DateInfoView ... x:Name="myUserControl"/> 

UserControl名前を付けて

public MainWindow() 
{ 
    InitializeComponent(); 

    Game.DateInfoModel = new DateInfoModel(); 
    myUserControl.DataContext = new DateInfoViewModel(Game.DateInfoModel); 
} 

の背後にあるコードでそれを使用しますプロパティでは、ウィンドウ全体のDataContextと設定し、XAMLではDataContextの具体的なUserControl(s)を大きなビューモデルのプロパティにバインドします。同様に、DataContextを1回だけ設定する必要があり、ウィンドウ内の他のすべてのコントロールに伝播します。

1

変更

view.DataContext = viewModel; 

ユーザーコントロールは、あなたがDateInfoViewの2つのインスタンスを持っているように見えること

+0

これはうまくいきますが、MainWindowにそれぞれ独自のviewmodelを持ついくつかのビューをどのように実装するのか迷ってしまいます。 – gartenriese

+1

@gartenrieseこれはあなたの問題を偶然によって解決します。 XAMLには「DateInfoView」のインスタンスが1つあり、後で使用しないコードで作成したインスタンスが1つあります。 'UserControl'の' DataContext'も同様に設定できますが、コントロールを名前で参照するなどして同じインスタンスにする必要があります。 – dkozl

+0

@dkozl:はい、私はちょうどあなたのコメントのおかげでそれを以前に見つけました。あなたが回答を投稿した場合、私はそれを喜んで受け入れます。 – gartenriese

関連する問題