this questionの助けを借りて、モデルの変更をリアルタイムでXAML(現在の日付/時刻)に表示する、以下のMVVM構造をまとめました。脂肪モデル、スキニーViewModelsとダムビュー、最高のMVVMのアプローチ?
は、このクールな利点は、あなたが デザインモードVisual Studioまたは ブレンドの、であなたのビューを見たとき、あなたがそのでの意味時間によって刻々と過ぎ、 を参照してくださいということまで で設定しましたデザインタイムは モデルのライブデータにアクセスできます。仕事にこれを取得する過程で
、私はINotifyPropertyChangeの実施を含め、私のモデルに私のViewModelからバルク移動、のほとんどを見て驚きました。もう1つの変更点は、が、ViewModelではのプロパティにバインドされなくなりましたが、のメソッドにバインドされなくなりました。
だから、現在、これはMVVMの私の好きな味です:
ビューはダムです:それぞれの
- 1たObjectDataProviderを使用すると、メソッドにモデル
- から各たObjectDataProviderマップを必要とするオブジェクト(プロパティではなく)ViewModelで
- x:XAML要素の名前プロパティ
ViewModelにはスキニーです:
- モデル:
- あなたのViewModelで唯一のものはあなたのビューが
モデルが太っているバインドにメソッドですそれぞれのプロパティでINotifyPropertyChangedを実装しています。
- ViewModelのすべてのメソッド(GetCurrentCustomerなど)には、対応するシングルトンメソッド(例:GetCurrentCustomer)があります。
- モデルは
- モデル:
質問この例のような機能をスレッディング任意のリアルタイムの面倒を見る:
- 実際のシナリオでMVVMを実施しているあなたの人々は、これです基本的な構造も決まりました。もしそうでなければ、どのように変化しますか?
- これを拡張して、ルーティングされたコマンドとルーティングされたイベントを含めるにはどうすればよいでしょうか?
次のコードは、XAMLとコードを新しいWPFプロジェクトにコピーするだけで動作します。
XAML:背後に
<Window x:Class="TestBinding99382.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestBinding99382"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<ObjectDataProvider
x:Key="DataSourceCustomer"
ObjectType="{x:Type local:ShowCustomerViewModel}"
MethodName="GetCurrentCustomer"/>
</Window.Resources>
<DockPanel DataContext="{StaticResource DataSourceCustomer}">
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
<TextBlock Text="{Binding Path=FirstName}"/>
<TextBlock Text=" "/>
<TextBlock Text="{Binding Path=LastName}"/>
</StackPanel>
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
<TextBlock Text="{Binding Path=TimeOfMostRecentActivity}"/>
</StackPanel>
</DockPanel>
</Window>
コード:
using System.Windows;
using System.ComponentModel;
using System;
using System.Threading;
namespace TestBinding99382
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
}
//view model
public class ShowCustomerViewModel
{
public Customer GetCurrentCustomer() {
return Customer.GetCurrentCustomer();
}
}
//model
public class Customer : INotifyPropertyChanged
{
private string _firstName;
private string _lastName;
private DateTime _timeOfMostRecentActivity;
private static Customer _currentCustomer;
private Timer _timer;
public string FirstName
{
get
{
return _firstName;
}
set
{
_firstName = value;
this.RaisePropertyChanged("FirstName");
}
}
public string LastName
{
get
{
return _lastName;
}
set
{
_lastName = value;
this.RaisePropertyChanged("LastName");
}
}
public DateTime TimeOfMostRecentActivity
{
get
{
return _timeOfMostRecentActivity;
}
set
{
_timeOfMostRecentActivity = value;
this.RaisePropertyChanged("TimeOfMostRecentActivity");
}
}
public Customer()
{
_timer = new Timer(UpdateDateTime, null, 0, 1000);
}
private void UpdateDateTime(object state)
{
TimeOfMostRecentActivity = DateTime.Now;
}
public static Customer GetCurrentCustomer()
{
if (_currentCustomer == null)
{
_currentCustomer = new Customer
{ FirstName = "Jim"
, LastName = "Smith"
, TimeOfMostRecentActivity = DateTime.Now
};
}
return _currentCustomer;
}
//INotifyPropertyChanged implementation
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
}
}
、あなたはこれらの答えを見ていたいかもしれません:http://stackoverflow.com/questions/650010/mvvm-routed-and-relay-command/6441472#6441472を – Marc