2016-11-02 9 views
-1

MVVMの起動時にviewmodelで関数を呼び出そうとしています。私はそれが正しいと思ったが、コードは決して関数呼び出しを打つことはない。ここでviewmodelのコールスタートアップ関数

は私のXAMLです:

<Window x:Class="TestWin.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
     xmlns:l="clr-namespace:Timeserver" 
     xmlns:viewmodel="clr-namespace:Timeserver.ViewModels" 
     Title="MainWindow" 
     Width="893" 
     Height="Auto" 
     Background="LightGray" 
     ResizeMode="NoResize" 
     SizeToContent="Height"> 
    <Window.DataContext> 
     <viewmodel:MainWindowViewModel /> 
    </Window.DataContext> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="Loaded"> 
      <i:InvokeCommandAction Command="{Binding LoadData}" /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 

ここに私のviewmodel(必要な部品)です:

namespace TestWin.ViewModels 
{ 
    class MainWindowViewModel 
    { 
     private StructsModel model; // my model class 

     private ICommand loadDataCmd; 

     private ICommand showTimeWindowCmd; 

     private ICommand toggleExecuteCommand { get; set; } 

     private bool canExecute = true; 

     public bool CanExecute 
     {    
      get 
      { 
       return this.canExecute; 
      } 

      set 
      { 
       if (this.canExecute == value) 
       { 
        return; 
       } 

       this.canExecute = value; 
      } 
     } 

     public ICommand ToggleExecuteCommand 
     { 
      get 
      { 
       return toggleExecuteCommand; 
      } 
      set 
      { 
       toggleExecuteCommand = value; 
      } 
     } 

     public ICommand ShowTimeWindowCmd 
     { 
      //code here 
     } 

     public ICommand LoadDataCmd 
     { 
      get 
      { 
       return loadDataCmd; 
      } 
      set 
      { 
       loadDataCmd = value; 
      } 
     } 

     public void LoadData(object parameter) 
     { 
      model.GetData(); 
     } 

     public MainWindowViewModel() 
     { 
      this.model = new StructsModel(); 
      LoadDataCmd = new RelayCommand(LoadData, param => this.canExecute); 
      ShowTimeWindowCmd = new RelayCommand(ShowTimeWindow, param => this.canExecute); 
      toggleExecuteCommand = new RelayCommand(ChangeCanExecute); 
     } 

     public void ShowTimeWindow(object parameter) 
     { 
      //code here 
     } 

     public void ChangeCanExecute(object obj) 
     { 
      canExecute = !canExecute; 
     } 
    } 
} 

ヒットされていない問題の関数がLoadData()です。私のモデルクラスでGetData()が呼び出されていますが、その理由はわかりません。他に何を試すかわからない私は同じことをやっているので、他の質問を見ました。私の他の機能ShowTimeWindowは全く同じ方法で設定され、ヒットします。

+0

データバインディングがどのように機能するかわからないようです。私はWPFデータバインディングエンジンに慣れ親しむことをお勧めします。メソッドにバインドしようとしていますが、これは動作しません。 – dymanoid

+0

私はより多くの研究をするつもりですが、私はこのサイトのような他の質問を見ていました:http://stackoverflow.com/a/17933290/2480598メソッドにコマンドをバインドすることができました。 – pfinferno

+2

Binding LoadDataではなく、Binding LoadDataCmdであるべきですか? – Steve

答えて

1

ViewModelをコードビハインドで作成できます。あなたが必要とする方法を呼び出すことができるよりも。あなたは卓越性のために行きたい場合は、Factoryパターンや依存性注入コンテナ(例えばウィンザー)を使用することができます

public MainWindow() 
{ 
    InitializeComponent(); 

    MainWindowViewModel vm = new MainWindowViewModel(); 

    DataContext = vm; 

    vm.LoadData(); 
} 
2

あなたが本当に呼び出しがロードで行うことにしたい場合は、XAMLコード

を削除することができ
<Window.DataContext> 
    <viewmodel:MainWindowViewModel /> 
</Window.DataContext> 

そして、上記のMatのように、コードの背後からビューモードをバインドします。次に、バインドしたコマンドがトリガされます(ビューモデル内の名前と同じ名前の場合)。コンストラクタでvm.LoadData()を呼び出す必要はありません。

また、「ロード済み」でデータをロードする以外のコマンドでコマンドを使用しないと、CanExecuteは役に立たなくなります。

関連する問題