8

私はちょうど 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
}

私のアプローチの問題は何ですか?

4

2 に答える 2

3

何もありません...しかし、DelegateCommand は、ViewModel だけに本当に固有の Command があり、それを他の人に公開したくない場合に便利です。それは本当に ViewModel だけのためです。また、ViewModel に渡すだけの別のクラスを必要としないため、DelegateCommands が好きです。記述するコードが少なくなります。提供されたViewModelが、コマンドを共有できるように多く共有されるベースViewModelである場合、あなたのアプローチは役立ちます。

于 2011-09-13T13:48:02.843 に答える
1

(フレームワークまたは独自のカスタム コマンドの) 基本コマンドを使用しない場合、同じコードを何度も記述していることに気付くでしょう。たとえばCanExecuteChanged、独自のコマンドでイベントを発生させません。の実装も同様INotifyPropertyChangedです。そのため、誰もが何らかの MVVM フレームワークを使用しています。

于 2011-09-13T13:48:20.633 に答える