私はちょうど WPF で MVVM について学んでいます。私は MVVM と同様に WPF の両方に完全に慣れていません (仕組みは理解していますが、使用したことはありません...)。
Web で見つけたすべてのチュートリアル/記事では、RelayCommand または DelegateCommand のいずれかを使用しています。
私の意見では、これらのパターンは VM が SRP の原則に違反することを余儀なくさせます。なぜなら、VM はコマンド ロジックを内部に保持するからです。
ICommand インターフェイスのカスタム実装を使用しないのはなぜですか? ちょうどこのような:
人物を表示して DB に保存しているとします。
私の Xaml は次のようになります。
<StackPanel>
<TextBlock Width="248" Height="24" Text="The name is:: " />
<TextBlock Width="248" Height="24" Text="{Binding Name}">
</TextBlock>
<TextBox HorizontalAlignment="Left" Name="textBox1" Width="120" Height="23"
VerticalAlignment="Top" Text="{Binding Name}"
/>
<Button Name="Salvar" VerticalAlignment="Bottom"
Command="{Binding SavePerson}"
CommandParameter="{Binding}">Save</Button>
</StackPanel>
これが私の VM です。
public class PersonVM: INotifyPropertyChanged
{
private string nameValue;
public string Name
{
get{
return nameValue;
}
set
{
if (value != this.nameValue)
{
this.nameValue= value;
NotifyPropertyChanged("Name");
}
}
}
public ICommand SavePerson{ get { return new SavePersonCommand(); } }
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
#endregion
}
そして、これは私のコマンドです:
public class SavePersonCommand: ICommand
{
#region ICommand Members
public bool CanExecute(object parameter)
{
return (parameter as PersonVM) != null;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
PersonVM person = parameter as PersonVM;
if(person != null)
//Actually Save the person...
}
#endregion
}
私のアプローチの問題は何ですか?